Ceci est une ancienne révision du document !
Table des matières
Kivy 2020: Buildozer pour compiler une application Android en python
Le programme python kivy
- 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
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.
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
Pour le 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
Compilation
buildozer -v android debug
Le *.apk sera dans ./bin
openjdk 11 vs 8
L'erreur
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.
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