kivy / python-for-android

Turn your Python application into an Android APK
https://python-for-android.readthedocs.io
MIT License
8.32k stars 1.84k forks source link

Google requiring 64 bits binary in August 2019 #1519

Closed tito closed 2 years ago

tito commented 5 years ago

In https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html:

In August 2019, Play will require that new apps and app updates with native libraries provide 64-bit versions in addition to their 32-bit versions.

I think we should default to arm64-v8a to prevent issues later, and start thinking how we can do multiple targets compilation and embedded them in one APK.

ghost commented 5 years ago

Hm, I wonder, I mean there are many armv7/32bit devices still out there now, but even new more budget devices being launched like the S9 mini are 64bit now. I don't want to stop anyone from working on this, but given how we're behind with other things, I can't help but wonder if multiple targets in one APK even worth this effort given it might largely solve itself in 2-3ish years

Edit: just been trying to find some reliable stats on how much ARM64 devices (compared to arm v7) are out there in consumer hands, couldn't find any. Anyone knows a good source? Would be interesting to see how the current market is divided up

brentpicasso commented 5 years ago

Checking on this - August is fast approaching; are 64 bit builds now possible with python-for-android?

inclement commented 5 years ago

@brentpicasso This has worked for a long time, use --arch=arm64-v8a. However, it isn't tested that well right now, we're working to improve this and probably to update some defaults. Some recipes may have issues, feel free to log issues about it if you find any.

brentpicasso commented 5 years ago

It looks like Google encourages one APK targeting multiple libs, so we don't have to submit multiple APKs. https://developer.android.com/distribute/best-practices/develop/64-bit

Is this the approach p4a will ultimately support?

brentpicasso commented 5 years ago

Further note, I think that specifying a comma separated list of architectures in buildozer could work well with p4a supporting multiple archs in the APK.

inclement commented 5 years ago

Is this the approach p4a will ultimately support?

Probably not any time soon, in that I don't intend to work on it and I don't expect that anyone else is either, but contributions for this would be welcome.

The reasons are:

ghost commented 5 years ago

Is there a significant advantage to a single APK with multiple archs over just uploading multiple APKs separately? Otherwise I'm wondering if it is worth the complexity in p4a, even though of course this will possibly increase build times for everyone going through the build twice - but then again, the time consuming compilation itself cannot be cut down anyway because it needs to be redone for each architecture in any case

inclement commented 5 years ago

I think there's a genuine convenience perspective, especially since a lot of people might not care about the size difference for simple apps (although I do!), so I've tended to think a PR for it would be okay. But, I've no expectation or desire for anyone to do it.

I did look into this when first setting up the arch stuff, I think at the time I thought it shouldn't actually be too bad in terms of complexity, although I didn't work through all the fiddly bits.

ghost commented 5 years ago

I don't use the play store much, so forgive my ignorance: but wouldn't the play store just automatically pick the right APK anyway? How does it make any difference in convenience for the end user?

inclement commented 5 years ago

I don't think it's that major, it's just simpler to not have to worry about it. Plus people do distribute apks in other ways.

Cheaterman commented 5 years ago

I just managed to update my app with 64 bits. The biggest pains are the recipes that don't work for it because they're hard-coded for 32 bits (eg. ffmpeg), and having to do this manually (I don't think there's a way to tell buildozer to do that?). Other than that, everything was rather smooth to be honest, signing as usual and uploading two APKs instead of one.

Oh and also, I'll have to update my target API to 28 soon apparently, that's going to be a new requirement of the Play Store somehow.

oleksii-manzik commented 5 years ago

I tryed to change android.arch to arm64-v8a in buildozer.spec but it didn't help. Google Play still tells me that my apk is armeabi-v7a. @Cheaterman can you please help me? How can I change my recipes to 64 bits?

AndreMiras commented 5 years ago

Hi @tito you're raising two things in this ticket.

  1. default to arm64-v8a
  2. start thinking how we can do multiple targets compilation

Both are very valid point, but I would recommend narrowing the scope to ease the discussions. Let's create two dedicated ticket for both points. For instance 1) is probably easier to address (at least at buildozer level) while 2) might be a lot more painful

SomberNight commented 5 years ago

So the suggestion when distributing apps on Google Play is to build two apks, one for armeabi-v7a, and one for arm64-v8a.

When using buildozer+p4a, what is the suggested way of doing this? As in, only one arch can be specified in android.arch in buildozer.spec. Should I script it such that the build runs twice and in-between git apply a diff that changes android.arch? Or is there a better way?

For example, it would be nice to be able to pass android.arch to buildozer on the CLI.

inclement commented 5 years ago

@SomberNight tito has created a PR at https://github.com/kivy/buildozer/pull/957 to make buildozer use per-arch build directories, but I'm intending to actually fix this transparently in p4a so that you don't have to worry about it.

For setting the arch differently on different buildozer runs, I think you can use the APP_ANDROID_ARCH environment variable, but it would be nice to have a better api for this.

brentpicasso commented 5 years ago

Below is our current approach, but specifying a comma separated list of architectures would be ideal, each creating an APK file with an arch prefix.

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

# build 32 bit APK
buildozer -v android clean
export APP_ANDROID_ARCH=armeabi-v7a 
./build_release_apk.sh
#rename APK to 32 bit version
cd bin; find -name "race*" -printf "%f\0" | xargs --null -I{} mv {} "32bit_{}"; cd ..

# build 64 bit APK
buildozer -v android clean
export APP_ANDROID_ARCH=arm64-v8a
./build_release_apk.sh
#rename APK to 64 bit version
cd bin; find -name "race*" -printf "%f\0" | xargs --null -I{} mv {} "64bit_{}"; cd ..
tito commented 5 years ago

It would be much cleaner if buildozer support comma on arch right. Let's see.

snmsung716 commented 5 years ago

When I used two arches(armeabi-v7a, arm64-v8a), I have an error attached. So I tried to use only armeabi-v7a, I could do the debug on Android Phone, but couldn't upload it on Google play because Google 64 bit was required. Lastly if I use only arm64-v8a, I can't do the debug because kivy might be not compatible with it, but can upload it on Google play even if that app doesn't work on Android Phone.

Basically I have used two basic Python-packages, kivy and request. This app is just a simple app. Does someone have any idea about this problem?

# 1.android.arch = armeabi-v7a, arm64-v8a

  1. sudo buildozer android debug

  2. error :

Command failed: /usr/bin/python3 -m pythonforandroid.toolchain clean_builds --color=always --storage-dir="/home/userName/Desktop/kivy/kivy_v7a_v8a/.buildozer/android/platform/build" --ndk-api=21 ENVIRONMENT: LS_COLORS = 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:.tar=01;31:.tgz=01;31:.arc=01;31:.arj=01;31:.taz=01;31:.lha=01;31:.lz4=01;31:.lzh=01;31:.lzma=01;31:.tlz=01;31:.txz=01;31:.tzo=01;31:.t7z=01;31:.zip=01;31:.z=01;31:.Z=01;31:.dz=01;31:.gz=01;31:.lrz=01;31:.lz=01;31:.lzo=01;31:.xz=01;31:.zst=01;31:.tzst=01;31:.bz2=01;31:.bz=01;31:.tbz=01;31:.tbz2=01;31:.tz=01;31:.deb=01;31:.rpm=01;31:.jar=01;31:.war=01;31:.ear=01;31:.sar=01;31:.rar=01;31:.alz=01;31:.ace=01;31:.zoo=01;31:.cpio=01;31:.7z=01;31:.rz=01;31:.cab=01;31:.wim=01;31:.swm=01;31:.dwm=01;31:.esd=01;31:.jpg=01;35:.jpeg=01;35:.mjpg=01;35:.mjpeg=01;35:.gif=01;35:.bmp=01;35:.pbm=01;35:.pgm=01;35:.ppm=01;35:.tga=01;35:.xbm=01;35:.xpm=01;35:.tif=01;35:.tiff=01;35:.png=01;35:.svg=01;35:.svgz=01;35:.mng=01;35:.pcx=01;35:.mov=01;35:.mpg=01;35:.mpeg=01;35:.m2v=01;35:.mkv=01;35:.webm=01;35:.ogm=01;35:.mp4=01;35:.m4v=01;35:.mp4v=01;35:.vob=01;35:.qt=01;35:.nuv=01;35:.wmv=01;35:.asf=01;35:.rm=01;35:.rmvb=01;35:.flc=01;35:.avi=01;35:.fli=01;35:.flv=01;35:.gl=01;35:.dl=01;35:.xcf=01;35:.xwd=01;35:.yuv=01;35:.cgm=01;35:.emf=01;35:.ogv=01;35:.ogx=01;35:.aac=00;36:.au=00;36:.flac=00;36:.m4a=00;36:.mid=00;36:.midi=00;36:.mka=00;36:.mp3=00;36:.mpc=00;36:.ogg=00;36:.ra=00;36:.wav=00;36:.oga=00;36:.opus=00;36:.spx=00;36:.xspf=00;36:' LC_MEASUREMENT = 'ja_JP.UTF-8' LESSCLOSE = '/usr/bin/lesspipe %s %s' LC_PAPER = 'ja_JP.UTF-8' LC_MONETARY = 'ja_JP.UTF-8' XDG_MENU_PREFIX = 'xfce-' LANG = 'en_US.UTF-8' GDM_LANG = 'en_US' DISPLAY = ':0.0' OLDPWD = '/home/userName/Desktop/kivy' GTK_OVERLAY_SCROLLING = '0' COLORTERM = 'truecolor' XDG_VTNR = '7' SSH_AUTH_SOCK = '/run/user/1000/keyring/ssh' GLADE_CATALOG_PATH = ':' LC_NAME = 'ja_JP.UTF-8' XDG_SESSION_ID = 'c1' XDG_GREETER_DATA_DIR = '/var/lib/lightdm-data/userName' USER = 'userName' GLADE_MODULE_PATH = ':' DESKTOP_SESSION = 'xubuntu' QT_QPA_PLATFORMTHEME = 'gtk2' PWD = '/home/userName/Desktop/kivy/kivy_v7a_v8a' HOME = '/home/userName' SSH_AGENT_PID = '1070' QT_ACCESSIBILITY = '1' XDG_SESSION_TYPE = 'x11' XDG_DATA_DIRS = '/usr/share/xubuntu:/usr/share/xfce4:/usr/local/share:/usr/share:/var/lib/snapd/desktop:/usr/share' XDG_SESSION_DESKTOP = 'xubuntu' LC_ADDRESS = 'ja_JP.UTF-8' LC_NUMERIC = 'ja_JP.UTF-8' GLADE_PIXMAP_PATH = ':' CLUTTER_BACKEND = 'x11' SHELL = '/bin/bash' VTE_VERSION = '5202' TERM = 'xterm-256color' XDG_SEAT_PATH = '/org/freedesktop/DisplayManager/Seat0' XDG_CURRENT_DESKTOP = 'XFCE' GPG_AGENT_INFO = '/run/user/1000/gnupg/S.gpg-agent:0:1' XDG_SEAT = 'seat0' SHLVL = '1' LANGUAGE = 'en_US' WINDOWID = '60817411' LC_TELEPHONE = 'ja_JP.UTF-8' GDMSESSION = 'xubuntu' LOGNAME = 'userName' DBUS_SESSION_BUS_ADDRESS = 'unix:path=/run/user/1000/bus' XDG_RUNTIME_DIR = '/run/user/1000' XAUTHORITY = '/home/userName/.Xauthority' XDG_SESSION_PATH = '/org/freedesktop/DisplayManager/Session0' XDG_CONFIG_DIRS = '/etc/xdg/xdg-xubuntu:/etc/xdg:/etc/xdg' PATH = '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin' LC_IDENTIFICATION = 'ja_JP.UTF-8' SESSION_MANAGER = 'local/userName-VirtualBox:@/tmp/.ICE-unix/1088,unix/userName-VirtualBox:/tmp/.ICE-unix/1088' LESSOPEN = '| /usr/bin/lesspipe %s' LC_TIME = 'jaJP.UTF-8' = '/usr/local/bin/buildozer'

Buildozer failed to execute the last command The error might be hidden in the log above this error Please read the full log, and search for it before raising an issue with buildozer itself. In case of a bug report, please add a full log with log_level = 2

inclement commented 5 years ago

Please post the full log of the failing build.

On 05/09/2019 21:29, Erick Lee wrote:

When I used two arches(armeabi-v7a, arm64-v8a), I have an error attached. So I tried to use only armeabi-v7a, I could do the debug on Android Phone, but couldn't upload it on Google play because Google 64 bit was required. Lastly if I use only arm64-v8a, I can't do the debug because kivy might be not compatible with it, but can upload it on Google play even if that app doesn't work on Android Phone.

Basically I have used basic Python-package, kivy and request. This app is just a simple app. Does someone have any idea about this problem?

1.android.arch = armeabi-v7a, arm64-v8a

  1. sudo buildozer android debug
  2. error :

    Command failed: /usr/bin/python3 -m pythonforandroid.toolchain clean_builds --color=always --storage-dir="/home/sangwon/Desktop/kivy/kivy_v7a_v8a/.buildozer/android/platform/build" --ndk-api=21

    ENVIRONMENT:

    LS_COLORS = 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:/.tar=01;31:/.tgz=01;31:/.arc=01;31:/.arj=01;31:/.taz=01;31:/.lha=01;31:/.lz4=01;31:/.lzh=01;31:/.lzma=01;31:/.tlz=01;31:/.txz=01;31:/.tzo=01;31:/.t7z=01;31:/.zip=01;31:/.z=01;31:/.Z=01;31:/.dz=01;31:/.gz=01;31:/.lrz=01;31:/.lz=01;31:/.lzo=01;31:/.xz=01;31:/.zst=01;31:/.tzst=01;31:/.bz2=01;31:/.bz=01;31:/.tbz=01;31:/.tbz2=01;31:/.tz=01;31:/.deb=01;31:/.rpm=01;31:/.jar=01;31:/.war=01;31:/.ear=01;31:/.sar=01;31:/.rar=01;31:/.alz=01;31:/.ace=01;31:/.zoo=01;31:/.cpio=01;31:/.7z=01;31:/.rz=01;31:/.cab=01;31:/.wim=01;31:/.swm=01;31:/.dwm=01;31:/.esd=01;31:/.jpg=01;35:/.jpeg=01;35:/.mjpg=01;35:/.mjpeg=01;35:/.gif=01;35:/.bmp=01;35:/.pbm=01;35:/.pgm=01;35:/.ppm=01;35:/.tga=01;35:/.xbm=01;35:/.xpm=01;35:/.tif=01;35:/.tiff=01;35:/.png=01;35:/.svg=01;35:/.svgz=01;35:/.mng=01;35:/.pcx=01;35:/.mov=01;35:/.mpg=01;35:/.mpeg=01;35:/.m2v=01;35:/.mkv=01;35:/.webm=01;35:/.ogm=01;35:/.mp4=01;35:/.m4v=01;35:/.mp4v=01;35:/.vob=01;35:/.qt=01;35:/.nuv=01;35:/.wmv=01;35:/.asf=01;35:/.rm=01;35:/.rmvb=01;35:/.flc=01;35:/.avi=01;35:/.fli=01;35:/.flv=01;35:/.gl=01;35:/.dl=01;35:/.xcf=01;35:/.xwd=01;35:/.yuv=01;35:/.cgm=01;35:/.emf=01;35:/.ogv=01;35:/.ogx=01;35:/.aac=00;36:/.au=00;36:/.flac=00;36:/.m4a=00;36:/.mid=00;36:/.midi=00;36:/.mka=00;36:/.mp3=00;36:/.mpc=00;36:/.ogg=00;36:/.ra=00;36:/.wav=00;36:/.oga=00;36:/.opus=00;36:/.spx=00;36:/.xspf=00;36:'

    LC_MEASUREMENT = 'ja_JP.UTF-8'

    LESSCLOSE = '/usr/bin/lesspipe %s %s'

    LC_PAPER = 'ja_JP.UTF-8'

    LC_MONETARY = 'ja_JP.UTF-8'

    XDG_MENU_PREFIX = 'xfce-'

    LANG = 'en_US.UTF-8'

    GDM_LANG = 'en_US'

    DISPLAY = ':0.0'

    OLDPWD = '/home/sangwon/Desktop/kivy'

    GTK_OVERLAY_SCROLLING = '0'

    COLORTERM = 'truecolor'

    XDG_VTNR = '7'

    SSH_AUTH_SOCK = '/run/user/1000/keyring/ssh'

    GLADE_CATALOG_PATH = ':'

    LC_NAME = 'ja_JP.UTF-8'

    XDG_SESSION_ID = 'c1'

    XDG_GREETER_DATA_DIR = '/var/lib/lightdm-data/sangwon'

    USER = 'sangwon'

    GLADE_MODULE_PATH = ':'

    DESKTOP_SESSION = 'xubuntu'

    QT_QPA_PLATFORMTHEME = 'gtk2'

    PWD = '/home/sangwon/Desktop/kivy/kivy_v7a_v8a'

    HOME = '/home/sangwon'

    SSH_AGENT_PID = '1070'

    QT_ACCESSIBILITY = '1'

    XDG_SESSION_TYPE = 'x11'

    XDG_DATA_DIRS = '/usr/share/xubuntu:/usr/share/xfce4:/usr/local/share:/usr/share:/var/lib/snapd/desktop:/usr/share'

    XDG_SESSION_DESKTOP = 'xubuntu'

    LC_ADDRESS = 'ja_JP.UTF-8'

    LC_NUMERIC = 'ja_JP.UTF-8'

    GLADE_PIXMAP_PATH = ':'

    CLUTTER_BACKEND = 'x11'

    SHELL = '/bin/bash'

    VTE_VERSION = '5202'

    TERM = 'xterm-256color'

    XDG_SEAT_PATH = '/org/freedesktop/DisplayManager/Seat0'

    XDG_CURRENT_DESKTOP = 'XFCE'

    GPG_AGENT_INFO = '/run/user/1000/gnupg/S.gpg-agent:0:1'

    XDG_SEAT = 'seat0'

    SHLVL = '1'

    LANGUAGE = 'en_US'

    WINDOWID = '60817411'

    LC_TELEPHONE = 'ja_JP.UTF-8'

    GDMSESSION = 'xubuntu'

    LOGNAME = 'sangwon'

    DBUS_SESSION_BUS_ADDRESS = 'unix:path=/run/user/1000/bus'

    XDG_RUNTIME_DIR = '/run/user/1000'

    XAUTHORITY = '/home/sangwon/.Xauthority'

    XDG_SESSION_PATH = '/org/freedesktop/DisplayManager/Session0'

    XDG_CONFIG_DIRS = '/etc/xdg/xdg-xubuntu:/etc/xdg:/etc/xdg'

    PATH = '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin'

    LC_IDENTIFICATION = 'ja_JP.UTF-8'

    SESSION_MANAGER = 'local/sangwon-VirtualBox:@/tmp/.ICE-unix/1088,unix/sangwon-VirtualBox:/tmp/.ICE-unix/1088'

    LESSOPEN = '| /usr/bin/lesspipe %s'

    LC_TIME = 'ja_JP.UTF-8'

    _ = '/usr/local/bin/buildozer'

    Buildozer failed to execute the last command

    The error might be hidden in the log above this error

    Please read the full log, and search for it before

    raising an issue with buildozer itself.

    In case of a bug report, please add a full log with log_level = 2

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/kivy/python-for-android/issues/1519?email_source=notifications&email_token=AAJVBG42CGW3367B7GVJFD3QIFT27A5CNFSM4GJUB4V2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOD6AU7EA#issuecomment-528568208, or mute the thread https://github.com/notifications/unsubscribe-auth/AAJVBGZFAODTHFVYGOC4ZO3QIFT27ANCNFSM4GJUB4VQ.

snmsung716 commented 5 years ago

Here are the full log and buildozer.spec.

briefly, I have an error on the log (toolchain.py: error: unrecognized arguments: arm64-v8a), while I have used both of them(android.arch = armeabi-v7a, arm64-v8a).

Log

sudo buildozer android debug

Check configuration tokens Buildozer is running as root! This is not recommended, and may lead to problems later. Are you sure you want to continue [y/n]? y Ensure build layout Check configuration tokens Preparing build Check requirements for android Run 'dpkg --version' Cwd None Debian 'dpkg' package management program version 1.19.0.5 (amd64). This is free software; see the GNU General Public License version 2 or later for copying conditions. There is NO warranty. Search for Git (git) -> found at /usr/bin/git Search for Cython (cython) -> found at /usr/local/bin/cython Search for Java compiler (javac) -> found at /usr/lib/jvm/java-8-openjdk-amd64/bin/javac Search for Java keytool (keytool) -> found at /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/keytool Install platform Run 'git config --get remote.origin.url' Cwd /home/userName/Desktop/kivy/kivy_v7a_v8a/.buildozer/android/platform/python-for-android https://github.com/kivy/python-for-android.git Run 'git branch -vv' Cwd /home/userName/Desktop/kivy/kivy_v7a_v8a/.buildozer/android/platform/python-for-android

Buildozer.spec

[app]

(str) Title of your application title = test1

(str) Package name package.name = myapp

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

(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

(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 = 1.4

(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,pyjnius,requests

(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, sensorLandscape, portrait or all) orientation = portrait

(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 = 0

(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 = WRITE_EXTERNAL_STORAGE,READ_EXTERNAL_STORAGE, INTERNET

(int) Target Android API, should be as high as possible. android.api = 28

(int) Minimum API your APK will support. android.minapi = 21

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

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

(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

(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 = ~/.buildozer/android/android-ndk-r17c

(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.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 =

(list) Java classes to add as activities to the manifest. android.add_activites = 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 =

(str) launchMode to set for the main activity android.manifest.launch_mode = standard

(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) 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, x86_64 android.arch = armeabi-v7a, arm64-v8a

Python for android (p4a) specific

(str) python-for-android fork to use, defaults to upstream (kivy) p4a.fork = kivy

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

(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

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

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.7.0

(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) 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

snmsung716 commented 5 years ago

I tried to do all arches on buildozer.spec and notice that Kivy doesn't work on Google play which requires arm64-v8a and armeabi_v7a simultaneously. Does anyone succeed in building those together? Maybe not working...

Fak3 commented 5 years ago

I have recently uploaded kivy app to google play successfully. I don't use buildozer, just p4a. I had to build 2 apks for 64 and 32 bits and uploaded both of them to google play.

inclement commented 5 years ago

@snmsung716 python-for-android does not support building multi-arch apks. It's probably possible with some work, but would have the disadvantage of the apk being almost double the size. For this reason, nobody is actively working on it, but a pull request to add such a feature would be welcome.

The supported alternative is, as @Fak3 said, to build one apk for each architecture.

snmsung716 commented 5 years ago

Thank you for the idea! Finally, I succeeded in building both of them separately and uploaded and published those on Google Play!

inclement commented 4 years ago

You can upload both versions, the requirement is that you provide at least a 64 bit version.

That said, you should also check if your phone is 64 bit. If it is supposed to be, the crash could be for some other reason.

On 03/08/2020 19:23, abstractdonut wrote:

I have a brand new phone but only the .apk targeting armeabi-v7a runs on it. The arm64-v8a version simply crashes immediately. Yet Google will only accept the 64-bit version. What a headache.

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/kivy/python-for-android/issues/1519#issuecomment-668172320, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAJVBGY23Y3MUSVZH5DQW3DR636BTANCNFSM4GJUB4VQ.

Munts-lab commented 4 years ago

You can upload both versions, the requirement is that you provide at least a 64 bit version. That said, you should also check if your phone is 64 bit. If it is supposed to be, the crash could be for some other reason. On 03/08/2020 19:23, abstractdonut wrote: I have a brand new phone but only the .apk targeting armeabi-v7a runs on it. The arm64-v8a version simply crashes immediately. Yet Google will only accept the 64-bit version. What a headache. — You are receiving this because you commented. Reply to this email directly, view it on GitHub <#1519 (comment)>, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAJVBGY23Y3MUSVZH5DQW3DR636BTANCNFSM4GJUB4VQ.

Hi! I have the same issue. The armeabi-v7 compilation works on my phone, and I upload it to Google Play , but the arm64-v8a shows that "Is not compatible" in my phone. I'm affraid to upload this version to GooglePlay without testing in any phone.... Do you think that Google will test it before launching?? I have done this via buildozer two times separately. First v7 , deleting all .buildozer and then v8... Any suggestions??

misl6 commented 2 years ago

I guess that we can close this one.

python-for-android supports multi-arch APKs and AABs, and buildozer now defaults to android.archs = arm64-v8a, armeabi-v7a (which produces a multi-arch package with both armeabi-v7a and arm64-v8a).