Table des matières
Kivy: Buildozer pour compiler une application Android en python
Generic Python packager for Android and iOS
Ressources
Utilisation sur Debian 11 Bullseye
Dépendances
sudo apt install libsdl2-dev zlib1g-dev pkg-config autoconf automake cmake dkms libtool libsdl2-2.0-0 ccache unzip ffmpeg libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev libswscale-dev libncurses5:i386 libstdc++6:i386 libgtk2.0-0:i386 libpangox-1.0-0:i386 libidn11:i386 zlib1g:i386 libssl-dev openssl gcc libpangoxft-1.0-0:i386 adb libtool build-essential libncurses5-dev libncursesw5-dev libtinfo5 lld
OpenJDK
Pour connaître votre version actuelle
java -version
Pour avoir la liste des versions installées
sudo update-java-alternatives --list
Pour changer de version
sudo update-alternatives --config java
Il faut la version 11
sudo apt install openjdk-11-jdk openjdk-11-source
Venv
C'est le buildozer du venv qui est utilisé !
Dans le dossier du venv existant:
source mon_env/bin/activate python3 -m pip install buildozer setuptools cython buildozer init File buildozer.spec created, ready to customize! toto@debian:/media/data/3D/projets/player/app$ source mon_env/bin/activate (mon_env) toto@debian:/media/data/3D/projets/player/app$ python3 -m pip install -r requirements.txt (mon_env) toto@debian:/media/data/3D/projets/player/app$ ./mon_env/bin/buildozer -v android debug
Le programme python kivy Hello world
- Les sources sur github avec le fichier buildozer.spec
- hello_world.py
#! /usr/bin/env python3 # -*- coding: utf-8 -*- import kivy kivy.require('1.11.1') from kivy.app import App from kivy.uix.label import Label class MyApp(App): def build(self): return Label(text='Hello world') if __name__ == '__main__': MyApp().run()
Compilation avec Buildozer
La page plus ancienne Kivy Comment créer une application android en python est en archive.
Installation
Des ressources suffisantes mais peut-être pas necéssaires !
sudo dpkg --add-architecture i386 sudo apt-get update sudo apt-get install libsdl2-dev zlib1g-dev pkg-config autoconf automake cmake dkms libtool libsdl2-2.0-0 ccache openjdk-11-jdk unzip ffmpeg libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev libportmidi-dev libswscale-dev libavformat-dev libavcodec-dev libgstreamer1.0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good libncurses5:i386 libstdc++6:i386 libgtk2.0-0:i386 libpangox-1.0-0:i386 libidn11:i386 zlib1g:i386 openjdk-11-source libssl-dev openssl gcc libpangoxft-1.0-0:i386 adb libtool build-essential python3-pip python3-dev python3-six libpython3-all-dev python3-all python3-all-dev python3-virtualenv virtualenv libncurses5-dev libncursesw5-dev libtinfo5 sudo pip3 install jinja2 appdirs sh colorama setuptools cython sudo pip3 install pygame kivy buildozer pyjnius
Utilisation
Le fichier principal qui lance kivy doit s'appeler main.py
Dans le dossier du projet:
buildozer init
crée le fichier buildozer.spec
buildozer.spec
Il faut définir une version pour l'application que vous compilez.
Le buildozer.spec du hello world
[app] title = My Application package.name = myapp package.domain = org.test source.dir = . source.include_exts = py,png,jpg,kv,atlas version = 0.14 requirements = python3,kivy orientation = portrait fullscreen = 0 android.arch = armeabi-v7a [buildozer] log_level = 2 warn_on_root = 1
Version Méthode 1
Cette ligne doit être la première ligne de code du fichier main.py; les versions seront gérées dans ce fichier.
__version__ = '0.67'
# (str) Application versioning (method 1) version.regex = __version__ = ['"](.*)['"] version.filename = %(source.dir)s/main.py # (str) Application versioning (method 2) # version = 1.2.0
Version Méthode 2
La version est définie dans ce fichier buildozer.spec:
# (str) Application versioning (method 1) #version.regex = __version__ = ['"](.*)['"] #version.filename = %(source.dir)s/main.py # (str) Application versioning (method 2) version = 1.2.0
Compilation
buildozer -v android debug
Le *.apk sera dans ./bin
openjdk 11 vs 8
L'erreur dans logcat de adb
java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
# Installing/updating SDK platform tools if necessary # Run '/home/serge/.buildozer/android/platform/android-sdk/tools/bin/sdkmanager tools platform-tools' # Cwd /home/serge/.buildozer/android/platform/android-sdk Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156) at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75) at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81) at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:73) at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:48) Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ... 5 more # Command failed: /home/serge/.buildozer/android/platform/android-sdk/tools/bin/sdkmanager tools platform-tools
Issue 862
Aucunes des solutions proposées par https://github.com/kivy/buildozer/issues/862 ne marchent.
Les recherches avec ce message d'erreur retourne beaucoup de longues pages: il y a un problème avec openjdk 11 ! et pas avec openjdk 8.
Nous utiliserons la version 8: facile !
Installation de openjdk8: https://installvirtual.com/install-java-8-on-debian-10-buster/
wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | sudo apt-key add - sudo add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/ sudo apt update -y sudo apt install adoptopenjdk-8-hotspot -y java -version sudo update-alternatives --config java
Choisir la version 8 !
Et à la fin c'est l'Allemagne qui gagne
Victoire ! Une application qui marche !
La compilation est longue, quelques heures, quelques Go téléchargés. Une recompilation suite à une nouvelle version serait bien sûr rapide (10 secondes).
13 Mo pour une application qui ne fait rien: myapp-0.13-armeabi-v7a-debug.apk.zip
Lorsque la compilation fini sur une erreur, je fais table rase: suppression des .android, .buildozer du home et du dossier du projet.
Deboggage sur Android
sudo apt-get install adb adb root adb shell kminilte:/sdcard/kivy/TapOSC $ logcat