Generic Python packager for Android and iOS
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
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
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
#! /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()
La page plus ancienne Kivy Comment créer une application android en python est en archive.
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
Le fichier principal qui lance kivy doit s'appeler main.py
Dans le dossier du projet:
buildozer init
crée le fichier buildozer.spec
Il faut définir une version pour l'application que vous compilez.
[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
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
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
buildozer -v android debug
Le *.apk sera dans ./bin
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
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.
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 !
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.
sudo apt-get install adb adb root adb shell kminilte:/sdcard/kivy/TapOSC $ logcat