kivy / buildozer

Generic Python packager for Android and iOS
https://buildozer.readthedocs.io
MIT License
1.74k stars 502 forks source link

Application crashes on start #546

Closed AlexPicaro closed 7 years ago

AlexPicaro commented 7 years ago

The application I am writing compiles correctly, but when I push it to a tablet and run it, it crashes as soon as it gets past the 'Loading' screen.

Here are my system specs:

The device I am trying to deploy to is an ASUS ZenPad 3s 10. I have turned on the developer options, but it is not rooted as it seems it is not possible at the moment. The tablet is running Android 7.0.

Here is my buildozer spec file:

[app]

# (str) Title of your application
title = ETS Demo

# (str) Package name
package.name = etsdemo

# (str) Package domain (needed for android/ios packaging)
package.domain = org.innodem

# (str) Source code where the main.py live
source.dir = .

# (list) Source files to include (let empty to include all the files)
source.include_exts = py,png,jpg,kv,atlas,dat

# (list) List of inclusions using pattern matching
#source.include_patterns = assets/*,images/*.png

# (list) Source files to exclude (let empty to not exclude anything)
#source.exclude_exts = spec

# (list) List of directory to exclude (let empty to not exclude anything)
#source.exclude_dirs = tests, bin

# (list) List of exclusions using pattern matching
#source.exclude_patterns = license,images/*/*.jpg

# (str) Application versioning (method 1)
version = 0.1

# (str) Application versioning (method 2)
# version.regex = __version__ = ['"](.*)['"]
# version.filename = %(source.dir)s/main.py

# (list) Application requirements
# comma seperated e.g. requirements = sqlite3,kivy
requirements = kivy,numpy,scipy,dlib,opencv,scikit-image,scikit-learn,imutils

# (str) Custom source folders for requirements
# Sets custom source for any requirements with recipes
# requirements.source.kivy = ../../kivy

# (list) Garden requirements
#garden_requirements =

# (str) Presplash of the application
#presplash.filename = %(source.dir)s/data/presplash.png

# (str) Icon of the application
#icon.filename = %(source.dir)s/data/icon.png

# (str) Supported orientation (one of landscape, portrait or all)
orientation = landscape

# (list) List of service to declare
#services = NAME:ENTRYPOINT_TO_PY,NAME2:ENTRYPOINT2_TO_PY

#
# OSX Specific
#

#
# author = © Copyright Info

# change the major version of python used by the app
osx.python_version = 3

# Kivy version to use
osx.kivy_version = 1.9.1

#
# Android specific
#

# (bool) Indicate if the application should be fullscreen or not
fullscreen = 1

# (string) Presplash background color (for new android toolchain)
# Supported formats are: #RRGGBB #AARRGGBB or one of the following names:
# red, blue, green, black, white, gray, cyan, magenta, yellow, lightgray,
# darkgray, grey, lightgrey, darkgrey, aqua, fuchsia, lime, maroon, navy,
# olive, purple, silver, teal.
#android.presplash_color = #FFFFFF

# (list) Permissions
android.permissions = CAMERA,READ_EXTERNAL_STORAGE,WRITE_EXTERNAL_STORAGE

# (int) Android API to use
#android.api = 19

# (int) Minimum API required
#android.minapi = 9

# (int) Android SDK version to use
#android.sdk = 20

# (str) Android NDK version to use
#android.ndk = 9c

# (bool) Use --private data storage (True) or --dir public storage (False)
#android.private_storage = True

# (str) Android NDK directory (if empty, it will be automatically downloaded.)
#android.ndk_path =

# (str) Android SDK directory (if empty, it will be automatically downloaded.)
#android.sdk_path = ~/Home/Android/Sdk/

# (str) ANT directory (if empty, it will be automatically downloaded.)
#android.ant_path =

# (bool) If True, then skip trying to update the Android sdk
# This can be useful to avoid excess Internet downloads or save time
# when an update is due and you just want to test/build your package
# android.skip_update = False

# (str) Android entry point, default is ok for Kivy-based app
#android.entrypoint = org.renpy.android.PythonActivity

# (list) Pattern to whitelist for the whole project
#android.whitelist =

# (str) Path to a custom whitelist file
#android.whitelist_src =

# (str) Path to a custom blacklist file
#android.blacklist_src =

# (list) List of Java .jar files to add to the libs so that pyjnius can access
# their classes. Don't add jars that you do not need, since extra jars can slow
# down the build process. Allows wildcards matching, for example:
# OUYA-ODK/libs/*.jar
#android.add_jars = foo.jar,bar.jar,path/to/more/*.jar

# (list) List of Java files to add to the android project (can be java or a
# directory containing the files)
#android.add_src =

# (list) Android AAR archives to add (currently works only with sdl2_gradle
# bootstrap)
#android.add_aars =

# (list) Gradle dependencies to add (currently works only with sdl2_gradle
# bootstrap)
#android.gradle_dependencies =

# (str) python-for-android branch to use, defaults to master
#p4a.branch = stable

# (str) OUYA Console category. Should be one of GAME or APP
# If you leave this blank, OUYA support will not be enabled
#android.ouya.category = GAME

# (str) Filename of OUYA Console icon. It must be a 732x412 png image.
#android.ouya.icon.filename = %(source.dir)s/data/ouya_icon.png

# (str) XML file to include as an intent filters in <activity> tag
#android.manifest.intent_filters =

# (list) Android additionnal libraries to copy into libs/armeabi
#android.add_libs_armeabi = libs/android/*.so
#android.add_libs_armeabi_v7a = libs/android-v7/*.so
#android.add_libs_x86 = libs/android-x86/*.so
#android.add_libs_mips = libs/android-mips/*.so

# (bool) Indicate whether the screen should stay on
# Don't forget to add the WAKE_LOCK permission if you set this to True
#android.wakelock = False

# (list) Android application meta-data to set (key=value format)
#android.meta_data =

# (list) Android library project to add (will be added in the
# project.properties automatically.)
#android.library_references =

# (str) Android logcat filters to use
#android.logcat_filters = *:S python:D

# (bool) Copy library instead of making a libpymodules.so
#android.copy_libs = 1

# (str) The Android arch to build for, choices: armeabi-v7a, arm64-v8a, x86
android.arch = armeabi-v7a

#
# Python for android (p4a) specific
#

# (str) python-for-android git clone directory (if empty, it will be automatically cloned from github)
#p4a.source_dir =

# (str) The directory in which python-for-android should look for your own build recipes (if any)
#p4a.local_recipes =

# (str) Filename to the hook for p4a
#p4a.hook =

# (str) Bootstrap to use for android builds
p4a.bootstrap = sdl2

#
# iOS specific
#

# (str) Path to a custom kivy-ios folder
#ios.kivy_ios_dir = ../kivy-ios

# (str) Name of the certificate to use for signing the debug version
# Get a list of available identities: buildozer ios list_identities
#ios.codesign.debug = "iPhone Developer: <lastname> <firstname> (<hexstring>)"

# (str) Name of the certificate to use for signing the release version
#ios.codesign.release = %(ios.codesign.debug)s

[buildozer]

# (int) Log level (0 = error only, 1 = info, 2 = debug (with command output))
log_level = 2

# (int) Display warning if buildozer is run as root (0 = False, 1 = True)
warn_on_root = 1

# (str) Path to build artifact storage, absolute or relative to spec file
# build_dir = ./.buildozer

# (str) Path to build output (i.e. .apk, .ipa) storage
# bin_dir = ./bin

#    -----------------------------------------------------------------------------
#    List as sections
#
#    You can define all the "list" as [section:key].
#    Each line will be considered as a option to the list.
#    Let's take [app] / source.exclude_patterns.
#    Instead of doing:
#
#[app]
#source.exclude_patterns = license,data/audio/*.wav,data/images/original/*
#
#    This can be translated into:
#
#[app:source.exclude_patterns]
#license
#data/audio/*.wav
#data/images/original/*
#

#    -----------------------------------------------------------------------------
#    Profiles
#
#    You can extend section / key with a profile
#    For example, you want to deploy a demo version of your application without
#    HD content. You could first change the title to add "(demo)" in the name
#    and extend the excluded directories to remove the HD content.
#
#[app@demo]
#title = My Application (demo)
#
#[app:source.exclude_patterns@demo]
#images/hd/*
#
#    Then, invoke the command line with the "demo" profile:
#
#buildozer --profile demo android debug

And here is a link to the logcat log file: https://www.dropbox.com/s/wrciz1od52rb1xh/log_tablet.txt?dl=0

inclement commented 7 years ago

You can debug the application using logcat. With buildozer, you can get this with buildozer android logcat.

If you can't resolve the problem with that information, please post the full details including this log on the kivy-users mailing list.

AlexPicaro commented 7 years ago

I have the log from logcat (linked in the original post, as it is ~14000 lines long), but I can't make sense of it. The line that seems to cause the crash is unable to stat file for the executable "/system/bin/sh": Permission denied

I'll post in the kivy-users mailing list.

inclement commented 7 years ago

Oh, sorry, I missed that. The important part is as below. It looks like dlib has compiled components and will need a recipe to work with p4a. Although the error is about 64 vs 32 bit, it's likely that it's only 64 bit because it's built for the wrong (desktop) architecture.

08-21 17:21:17.626 10478 10554 I python  : [INFO   ] [OSC         ] using <thread> for socket
08-21 17:21:17.633 10478 10554 I python  : [INFO   ] [Window      ] Provider: sdl2
08-21 17:21:17.641 10478 10554 W linker  : /data/data/org.innodem.etsdemo/files/app/lib/python2.7/site-packages/kivy/graphics/cgl_backend/cgl_glew.so: is missing DT_SONAME will use basename as a replacement: "cgl_glew.so"
08-21 17:21:17.642 10478 10554 W linker  : /data/data/org.innodem.etsdemo/files/app/lib/python2.7/site-packages/kivy/graphics/cgl_backend/cgl_gl.so: is missing DT_SONAME will use basename as a replacement: "cgl_gl.so"
08-21 17:21:17.650   303  1128 D IMGSRV  : gralloc_device_alloc:1305: hnd=0x7e2d356640 ID=25274 fd=90 ref=0 1536(1536)x2048-0x1 usage=0xb00 size=12582912(12582912) cache=0
08-21 17:21:17.650 10478 10554 D IMGSRV  : gralloc_register_buffer:1583: hnd=0xc840c8c0 ID=25274 fd=66 ref=1
08-21 17:21:17.652 10478 10554 I python  : [INFO   ] [GL          ] Using the "OpenGL ES 2" graphics system
08-21 17:21:17.653 10478 10554 I python  : [INFO   ] [GL          ] Backend used <gl>
08-21 17:21:17.653 10478 10554 I python  : [INFO   ] [GL          ] OpenGL version <OpenGL ES 3.2 build 1.7@4167538>
08-21 17:21:17.653 10478 10554 I python  : [INFO   ] [GL          ] OpenGL vendor <Imagination Technologies>
08-21 17:21:17.654 10478 10554 I python  : [INFO   ] [GL          ] OpenGL renderer <PowerVR Rogue GX6250>
08-21 17:21:17.654 10478 10554 I python  : [INFO   ] [GL          ] OpenGL parsed version: 3, 2
08-21 17:21:17.654 10478 10554 I python  : [INFO   ] [GL          ] Texture max size <8192>
08-21 17:21:17.654 10478 10554 I python  : [INFO   ] [GL          ] Texture max units <16>
08-21 17:21:17.682 10478 10554 I python  : [INFO   ] [Shader      ] fragment shader: <Success.>
08-21 17:21:17.690 10478 10554 I python  : [INFO   ] [Shader      ] vertex shader: <Success.>
08-21 17:21:17.692 10478 10554 I python  : [INFO   ] [Window      ] auto add sdl2 input provider
08-21 17:21:17.693 10478 10554 I python  : [INFO   ] [Window      ] virtual keyboard not allowed, single mode, not docked
08-21 17:21:17.699 10478 10554 W linker  : /data/data/org.innodem.etsdemo/files/app/lib/python2.7/site-packages/kivy/core/text/text_layout.so: is missing DT_SONAME will use basename as a replacement: "text_layout.so"
08-21 17:21:17.701 10478 10554 W linker  : /data/data/org.innodem.etsdemo/files/app/lib/python2.7/site-packages/kivy/core/text/_text_sdl2.so: is missing DT_SONAME will use basename as a replacement: "_text_sdl2.so"
08-21 17:21:17.703 10478 10554 I python  : [INFO   ] [Text        ] Provider: sdl2
08-21 17:21:17.721 10478 10554 I python  :  Traceback (most recent call last):
08-21 17:21:17.721 10478 10554 I python  :    File "/home/alexandre/Desktop/Demo/.buildozer/android/app/main.py", line 26, in <module>
08-21 17:21:17.721 10478 10554 I python  :    File "/home/alexandre/Desktop/Demo/.buildozer/android/app/kivyCam.py", line 17, in <module>
08-21 17:21:17.721 10478 10554 I python  :    File "/home/alexandre/Desktop/Demo/.buildozer/android/app/faceDetector.py", line 13, in <module>
08-21 17:21:17.722 10478 10554 I python  :    File "/home/alexandre/Desktop/Demo/.buildozer/android/platform/build/dists/etsdemo/private/lib/python2.7/site-packages/dlib/__init__.py", line 1, in <module>
08-21 17:21:17.722 10478 10554 I python  :  ImportError: dlopen failed: "/data/data/org.innodem.etsdemo/files/app/lib/python2.7/site-packages/dlib/dlib.so" is 64-bit instead of 32-bit
08-21 17:21:17.758 10478 10554 I python  : Python for android ended.
AlexPicaro commented 7 years ago

Thanks for the reply!

I tried following the p4a documentation and buildozer documentation about recipes. I forked and cloned the p4a Github repo and modified the spec file as follows:

# (str) python-for-android git clone directory (if empty, it will be automatically cloned from github)
p4a.source_dir = ~/Desktop/python-for-android

I then created the following directory: Desktop/python-for-android/pythonforandroid/recipes/dlib Under that directory, I created the following recipe, named __init__.py:

from pythonforandroid.toolchain import Recipe

class DlibRecipe(Recipe):
    name = 'dlib'
    version = '1.0'
    url = 'http://dlib.net/files/dlib-19.4.tar.bz2'

    def prebuild_arch(self, arch):
        super(DlibRecipe, self).prebuild_arch(arch)
        # Do any pre-initialisation

    def build_arch(self, arch):
        super(DlibRecipe, self).build_arch(arch)
        # Do the main recipe build

    def postbuild_arch(self, arch):
        super(DlibRecipe, self).build_arch(arch)
        # Do any clearing up

recipe = DlibRecipe()

I'm not sure what else I'm supposed to include in the recipe, as I am struggling to understand the documentation. I have looked at other recipes in the repo and some of them are that simple. When I build my project, I get the following lines which seem to say my recipe is being used:

[INFO]:    Of the existing distributions, the following meet the given requirements:
[INFO]:     etsdemo: includes recipes (hostpython2, sdl2_image, sdl2_mixer, sdl2_ttf, python2, numpy, sdl2, six, opencv, pyjnius, kivy, scikit-learn, scikit-image, imutils, scipy, dlib), built for archs (armeabi-v7a)

However, when I deploy the application to the tablet, I get the same error message:

08-22 14:47:49.731 20527 20599 I python  : [INFO   ] [OSC         ] using <thread> for socket
08-22 14:47:49.736 20527 20599 I python  : [INFO   ] [Window      ] Provider: sdl2
08-22 14:47:49.743 20527 20599 W linker  : /data/data/org.innodem.etsdemo/files/app/lib/python2.7/site-packages/kivy/graphics/cgl_backend/cgl_glew.so: is missing DT_SONAME will use basename as a replacement: "cgl_glew.so"
08-22 14:47:49.743 20527 20599 W linker  : /data/data/org.innodem.etsdemo/files/app/lib/python2.7/site-packages/kivy/graphics/cgl_backend/cgl_gl.so: is missing DT_SONAME will use basename as a replacement: "cgl_gl.so"
08-22 14:47:49.750   303   310 D IMGSRV  : gralloc_device_alloc:1305: hnd=0x7e2cc15760 ID=48640 fd=45 ref=0 1536(1536)x2048-0x1 usage=0xb00 size=12582912(12582912) cache=0
08-22 14:47:49.750 20527 20599 D IMGSRV  : gralloc_register_buffer:1583: hnd=0xe41ca8c0 ID=48640 fd=66 ref=1
08-22 14:47:49.753 20527 20599 I python  : [INFO   ] [GL          ] Using the "OpenGL ES 2" graphics system
08-22 14:47:49.753 20527 20599 I python  : [INFO   ] [GL          ] Backend used <gl>
08-22 14:47:49.754 20527 20599 I python  : [INFO   ] [GL          ] OpenGL version <OpenGL ES 3.2 build 1.7@4167538>
08-22 14:47:49.754 20527 20599 I python  : [INFO   ] [GL          ] OpenGL vendor <Imagination Technologies>
08-22 14:47:49.754 20527 20599 I python  : [INFO   ] [GL          ] OpenGL renderer <PowerVR Rogue GX6250>
08-22 14:47:49.754 20527 20599 I python  : [INFO   ] [GL          ] OpenGL parsed version: 3, 2
08-22 14:47:49.754 20527 20599 I python  : [INFO   ] [GL          ] Texture max size <8192>
08-22 14:47:49.754 20527 20599 I python  : [INFO   ] [GL          ] Texture max units <16>
08-22 14:47:49.779 20527 20599 I python  : [INFO   ] [Shader      ] fragment shader: <Success.>
08-22 14:47:49.787 20527 20599 I python  : [INFO   ] [Shader      ] vertex shader: <Success.>
08-22 14:47:49.789 20527 20599 I python  : [INFO   ] [Window      ] auto add sdl2 input provider
08-22 14:47:49.790 20527 20599 I python  : [INFO   ] [Window      ] virtual keyboard not allowed, single mode, not docked
08-22 14:47:49.796 20527 20599 W linker  : /data/data/org.innodem.etsdemo/files/app/lib/python2.7/site-packages/kivy/core/text/text_layout.so: is missing DT_SONAME will use basename as a replacement: "text_layout.so"
08-22 14:47:49.798 20527 20599 W linker  : /data/data/org.innodem.etsdemo/files/app/lib/python2.7/site-packages/kivy/core/text/_text_sdl2.so: is missing DT_SONAME will use basename as a replacement: "_text_sdl2.so"
08-22 14:47:49.799 20527 20599 I python  : [INFO   ] [Text        ] Provider: sdl2
08-22 14:47:49.817 20527 20599 I python  :  Traceback (most recent call last):
08-22 14:47:49.817 20527 20599 I python  :    File "/home/alexandre/Desktop/Demo/.buildozer/android/app/main.py", line 26, in <module>
08-22 14:47:49.817 20527 20599 I python  :    File "/home/alexandre/Desktop/Demo/.buildozer/android/app/kivyCam.py", line 17, in <module>
08-22 14:47:49.817 20527 20599 I python  :    File "/home/alexandre/Desktop/Demo/.buildozer/android/app/faceDetector.py", line 13, in <module>
08-22 14:47:49.818 20527 20599 I python  :    File "/home/alexandre/Desktop/Demo/.buildozer/android/platform/build/dists/etsdemo/private/lib/python2.7/site-packages/dlib/__init__.py", line 1, in <module>
08-22 14:47:49.818 20527 20599 I python  :  ImportError: dlopen failed: "/data/data/org.innodem.etsdemo/files/app/lib/python2.7/site-packages/dlib/dlib.so" is 64-bit instead of 32-bit
08-22 14:47:49.853 20527 20599 I python  : Python for android ended.

Here is a link to the full log: https://www.dropbox.com/s/ydsp9ke93z0zd19/log_tablet_4.txt?dl=0

MasterHansCoding commented 2 years ago

Hello,

Have you tried to build without all the libraries you put in your spec file, and add them one by one ? I think opencv and imutils make the app crash when launching on the phone. Also shouldn't it be opencv-python as we do pip install opencv-python ?

lackfadiriso commented 4 months ago

I am new to Python Kivy and I compiled the apk without any errors, but when I run it, it crashes after the loading screen. buildozer.spec:# This .spec config file tells Buildozer an app's requirements for being built.

#

It largely follows the syntax of an .ini file.

See the end of the file for more details and warnings about common mistakes.

[app]

(str) Title of your application

title = DownTube

(str) Package name

package.name = downtube.app

(str) Package domain (needed for android/ios packaging)

package.domain = org.downtube

(str) Source code where the main.py live

source.dir = .

(list) Source files to include (leave empty to include all the files)

source.include_exts = py,png,jpg,kv,atlas

(list) List of inclusions using pattern matching

source.include_patterns = assets/,images/.png

(list) Source files to exclude (leave empty to not exclude anything)

source.exclude_exts = spec

(list) List of directory to exclude (leave empty to not exclude anything)

source.exclude_dirs = tests, bin, venv

(list) List of exclusions using pattern matching

Do not prefix with './'

source.exclude_patterns = license,images//.jpg

(str) Application versioning (method 1)

version = 0.1

(str) Application versioning (method 2)

version.regex = version = '"['"]

version.filename = %(source.dir)s/main.py

(list) Application requirements

comma separated e.g. requirements = sqlite3,kivy

requirements = python3,kivy==2.1.0,pytube==15.0.0,moviepy==1.0.3

(str) Custom source folders for requirements

Sets custom source for any requirements with recipes

requirements.source.kivy = ../../kivy

(str) Presplash of the application

presplash.filename = loading.png

presplash.scale = fill

(str) Icon of the application

icon.filename = logo.png

(list) Supported orientations

Valid options are: landscape, portrait, portrait-reverse or landscape-reverse

orientation = portrait

(list) List of services to declare

This is currently only relevant to Android services.

Each service consists of a name (a valid Java class name, with the first letter capitalized)

followed by a colon, followed by the name of the Python script (.py file) that should be

launched. This is optionally followed by ":foreground" for foreground services or

":foreground:sticky" for sticky foreground services. The default is a background service.

Bound services are not supported.

services = NAME:ENTRYPOINT_TO_PY,NAME2:ENTRYPOINT2_TO_PY

#

OSX Specific

#

#

author = © Copyright Info

Kivy version to use

osx.kivy_version = 2.1.0

#

Android specific

#

(bool) Indicate if the application should be fullscreen or not

fullscreen = 0

(string) Presplash background color (for android toolchain)

Supported formats are: #RRGGBB #AARRGGBB or one of the following names:

red, blue, green, black, white, gray, cyan, magenta, yellow, lightgray,

darkgray, grey, lightgrey, darkgrey, aqua, fuchsia, lime, maroon, navy,

olive, purple, silver, teal.

android.presplash_color = #FFFFFF

(string) Presplash animation using Lottie format.

see https://lottiefiles.com/ for examples and https://airbnb.design/lottie/

for general documentation.

Lottie files can be created using various tools, like Adobe After Effect or Synfig.

android.presplash_lottie = "path/to/lottie/file.json"

(str) Adaptive icon of the application (used if Android API level is 26+ at runtime)

icon.adaptive_foreground.filename = %(source.dir)s/data/icon_fg.png

icon.adaptive_background.filename = %(source.dir)s/data/icon_bg.png

(list) Permissions

(See https://python-for-android.readthedocs.io/en/latest/buildoptions.html for all the supported syntaxes and properties)

android.permissions = INTERNET, WRITE_EXTERNAL_STORAGE

(list) features (adds uses-feature -tags to manifest)

android.features = android.hardware.usb.host

(int) Target Android API, should be as high as possible.

android.api = 31

(int) Minimum API your APK / AAB will support.

android.minapi = 21

(int) Android SDK version to use

android.sdk = 29

(str) Android NDK version to use

android.ndk = 23b

(int) Android NDK API to use. This is the minimum API your app will support, it should usually match android.minapi.

android.ndk_api = 21

(str) Android NDK directory (if empty, it will be automatically downloaded.)

android.ndk_path =

(str) Android SDK directory (if empty, it will be automatically downloaded.)

android.sdk_path =

(str) ANT directory (if empty, it will be automatically downloaded.)

android.ant_path =

(bool) If True, then skip trying to update the Android SDK

This can be useful to avoid excess Internet downloads or save time

when an update is due and you just want to test/build your package

android.skip_update = False

(bool) If True, then automatically accept SDK license

agreements. This is intended for automation only. If set to False,

the default, you will be shown the license when first running

buildozer.

android.accept_sdk_license = False

(str) Android entry point, default is ok for Kivy-based app

android.entrypoint = org.kivy.android.PythonActivity

(str) Full name including package path of the Java class that implements Android Activity

use that parameter together with android.entrypoint to set custom Java class instead of PythonActivity

android.activity_class_name = org.kivy.android.PythonActivity

(str) Extra xml to write directly inside the element of AndroidManifest.xml

use that parameter to provide a filename from where to load your custom XML code

android.extra_manifest_xml = ./src/android/extra_manifest.xml

(str) Extra xml to write directly inside the tag of AndroidManifest.xml

use that parameter to provide a filename from where to load your custom XML arguments:

android.extra_manifest_application_arguments = ./src/android/extra_manifest_application_arguments.xml

(str) Full name including package path of the Java class that implements Python Service

use that parameter to set custom Java class which extends PythonService

android.service_class_name = org.kivy.android.PythonService

(str) Android app theme, default is ok for Kivy-based app

android.apptheme = "@android:style/Theme.NoTitleBar"

(list) Pattern to whitelist for the whole project

android.whitelist =

(bool) If True, your application will be listed as a home app (launcher app)

android.home_app = False

(str) Path to a custom whitelist file

android.whitelist_src =

(str) Path to a custom blacklist file

android.blacklist_src =

(list) List of Java .jar files to add to the libs so that pyjnius can access

their classes. Don't add jars that you do not need, since extra jars can slow

down the build process. Allows wildcards matching, for example:

OUYA-ODK/libs/*.jar

android.add_jars = foo.jar,bar.jar,path/to/more/*.jar

(list) List of Java files to add to the android project (can be java or a

directory containing the files)

android.add_src =

(list) Android AAR archives to add

android.add_aars =

(list) Put these files or directories in the apk assets directory.

Either form may be used, and assets need not be in 'source.include_exts'.

1) android.add_assets = source_asset_relative_path

2) android.add_assets = source_asset_path:destination_asset_relative_path

android.add_assets =

(list) Put these files or directories in the apk res directory.

The option may be used in three ways, the value may contain one or zero ':'

Some examples:

1) A file to add to resources, legal resource names contain ['a-z','0-9','_']

android.add_resources = my_icons/all-inclusive.png:drawable/all_inclusive.png

2) A directory, here 'legal_icons' must contain resources of one kind

android.add_resources = legal_icons:drawable

3) A directory, here 'legal_resources' must contain one or more directories,

each of a resource kind: drawable, xml, etc...

android.add_resources = legal_resources

android.add_resources =

(list) Gradle dependencies to add

android.gradle_dependencies =

(bool) Enable AndroidX support. Enable when 'android.gradle_dependencies'

contains an 'androidx' package, or any package from Kotlin source.

android.enable_androidx requires android.api >= 28

android.enable_androidx = True

(list) add java compile options

this can for example be necessary when importing certain java libraries using the 'android.gradle_dependencies' option

see https://developer.android.com/studio/write/java8-support for further information

android.add_compile_options = "sourceCompatibility = 1.8", "targetCompatibility = 1.8"

(list) Gradle repositories to add {can be necessary for some android.gradle_dependencies}

please enclose in double quotes

e.g. android.gradle_repositories = "maven { url 'https://repo.spring.io/release' }"

android.add_gradle_repositories =

(list) packaging options to add

see https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/dsl/PackagingOptions

can be necessary to solve conflicts in gradle_dependencies

please enclose in double quotes

e.g. android.add_packaging_options = "exclude 'META-INF/common.kotlin_module'", "exclude 'META-INF/*.kotlin_module'"

android.add_packaging_options =

(list) Java classes to add as activities to the manifest.

android.add_activities = com.example.ExampleActivity

(str) OUYA Console category. Should be one of GAME or APP

If you leave this blank, OUYA support will not be enabled

android.ouya.category = GAME

(str) Filename of OUYA Console icon. It must be a 732x412 png image.

android.ouya.icon.filename = %(source.dir)s/data/ouya_icon.png

(str) XML file to include as an intent filters in tag

android.manifest.intent_filters =

(list) Copy these files to src/main/res/xml/ (used for example with intent-filters)

android.res_xml = PATH_TO_FILE,

(str) launchMode to set for the main activity

android.manifest.launch_mode = standard

(str) screenOrientation to set for the main activity.

Valid values can be found at https://developer.android.com/guide/topics/manifest/activity-element

android.manifest.orientation = fullSensor

(list) Android additional libraries to copy into libs/armeabi

android.add_libs_armeabi = libs/android/*.so

android.add_libs_armeabi_v7a = libs/android-v7/*.so

android.add_libs_arm64_v8a = libs/android-v8/*.so

android.add_libs_x86 = libs/android-x86/*.so

android.add_libs_mips = libs/android-mips/*.so

(bool) Indicate whether the screen should stay on

Don't forget to add the WAKE_LOCK permission if you set this to True

android.wakelock = False

(list) Android application meta-data to set (key=value format)

android.meta_data =

(list) Android library project to add (will be added in the

project.properties automatically.)

android.library_references =

(list) Android shared libraries which will be added to AndroidManifest.xml using tag

android.uses_library =

(str) Android logcat filters to use

android.logcat_filters = *:S python:D

(bool) Android logcat only display log for activity's pid

android.logcat_pid_only = False

(str) Android additional adb arguments

android.adb_args = -H host.docker.internal

(bool) Copy library instead of making a libpymodules.so

android.copy_libs = 1

(list) The Android archs to build for, choices: armeabi-v7a, arm64-v8a, x86, x86_64

In past, was android.arch as we weren't supporting builds for multiple archs at the same time.

android.archs = arm64-v8a, armeabi-v7a

(int) overrides automatic versionCode computation (used in build.gradle)

this is not the same as app version and should only be edited if you know what you're doing

android.numeric_version = 1

(bool) enables Android auto backup feature (Android API >=23)

android.allow_backup = True

(str) XML file for custom backup rules (see official auto backup documentation)

android.backup_rules =

(str) If you need to insert variables into your AndroidManifest.xml file,

you can do so with the manifestPlaceholders property.

This property takes a map of key-value pairs. (via a string)

Usage example : android.manifest_placeholders = [myCustomUrl:\"org.kivy.customurl\"]

android.manifest_placeholders = [:]

(bool) Skip byte compile for .py files

android.no-byte-compile-python = False

(str) The format used to package the app for release mode (aab or apk or aar).

android.release_artifact = aab

(str) The format used to package the app for debug mode (apk or aar).

android.debug_artifact = apk

#

Python for android (p4a) specific

#

(str) python-for-android URL to use for checkout

p4a.url =

(str) python-for-android fork to use in case if p4a.url is not specified, defaults to upstream (kivy)

p4a.fork = kivy

(str) python-for-android branch to use, defaults to master

p4a.branch = master

(str) python-for-android specific commit to use, defaults to HEAD, must be within p4a.branch

p4a.commit = HEAD

(str) python-for-android git clone directory

p4a.source_dir =

(str) The directory in which python-for-android should look for your own build recipes (if any)

p4a.local_recipes =

(str) Filename to the hook for p4a

p4a.hook =

(str) Bootstrap to use for android builds

Run "buildozer android p4a -- bootstraps" for a list of valid values.

p4a.bootstrap = sdl2

(int) port number to specify an explicit --port= p4a argument (eg for bootstrap flask)

p4a.port =

Control passing the --use-setup-py vs --ignore-setup-py to p4a

"in the future" --use-setup-py is going to be the default behaviour in p4a, right now it is not

Setting this to false will pass --ignore-setup-py, true will pass --use-setup-py

NOTE: this is general setuptools integration, having pyproject.toml is enough, no need to generate

setup.py if you're using Poetry, but you need to add "toml" to source.include_exts.

p4a.setup_py = false

(str) extra command line arguments to pass when invoking pythonforandroid.toolchain

p4a.extra_args =

#

iOS specific

#

(str) Path to a custom kivy-ios folder

ios.kivy_ios_dir = ../kivy-ios

Alternately, specify the URL and branch of a git checkout:

ios.kivy_ios_url = https://github.com/kivy/kivy-ios

ios.kivy_ios_branch = master

Another platform dependency: ios-deploy

Uncomment to use a custom checkout

ios.ios_deploy_dir = ../ios_deploy

Or specify URL and branch

ios.ios_deploy_url = https://github.com/phonegap/ios-deploy

ios.ios_deploy_branch = 1.12.2

(bool) Whether or not to sign the code

ios.codesign.allowed = false

(str) Name of the certificate to use for signing the debug version

Get a list of available identities: buildozer ios list_identities

ios.codesign.debug = "iPhone Developer: ()"

(str) The development team to use for signing the debug version

ios.codesign.development_team.debug =

(str) Name of the certificate to use for signing the release version

ios.codesign.release = %(ios.codesign.debug)s

(str) The development team to use for signing the release version

ios.codesign.development_team.release =

(str) URL pointing to .ipa file to be installed

This option should be defined along with display_image_url and full_size_image_url options.

ios.manifest.app_url =

(str) URL pointing to an icon (57x57px) to be displayed during download

This option should be defined along with app_url and full_size_image_url options.

ios.manifest.display_image_url =

(str) URL pointing to a large icon (512x512px) to be used by iTunes

This option should be defined along with app_url and display_image_url options.

ios.manifest.full_size_image_url =

[buildozer]

(int) Log level (0 = error only, 1 = info, 2 = debug (with command output))

log_level = 2

(int) Display warning if buildozer is run as root (0 = False, 1 = True)

warn_on_root = 1

(str) Path to build artifact storage, absolute or relative to spec file

build_dir = ./.buildozer

(str) Path to build output (i.e. .apk, .aab, .ipa) storage

bin_dir = ./bin

-----------------------------------------------------------------------------

Notes about using this file:

#

Buildozer uses a variant of Python's ConfigSpec to read this file.

For the basic syntax, including interpolations, see

https://docs.python.org/3/library/configparser.html#supported-ini-file-structure

#

Warning: Comments cannot be used "inline" - i.e.

[app]

title = My Application # This is not a comment, it is part of the title.

#

Warning: Indented text is treated as a multiline string - i.e.

[app]

title = My Application

package.name = myapp # This is all part of the title.

#

Buildozer's .spec files have some additional features:

#

Buildozer supports lists - i.e.

[app]

source.include_exts = py,png,jpg

^ This is a list.

#

[app:source.include_exts]

py

png

jpg

^ This is an alternative syntax for a list.

#

Buildozer's option names are case-sensitive, unlike most .ini files.

#

Buildozer supports overriding options through environment variables.

Name an environment variable as SECTION_OPTION to override a value in a .spec

file.

#

Buildozer support overriding options through profiles.

For example, you want to deploy a demo version of your application without

HD content. You could first change the title to add "(demo)" in the name

and extend the excluded directories to remove the HD content.

#

[app@demo]

title = My Application (demo)

#

[app:source.exclude_patterns@demo]

images/hd/*

#

Then, invoke the command line with the "demo" profile:

#

buildozer --profile demo android debug

#

Environment variable overrides have priority over profile overrides.

lackfadiriso commented 4 months ago

I can't run it with logcat because I'm in a virtual machine, I send it directly to the phone via WhatsApp and try it.