Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Google requiring 64 bits binary in August 2019 #1519

Closed
tito opened this issue Dec 11, 2018 · 27 comments
Closed

Google requiring 64 bits binary in August 2019 #1519

tito opened this issue Dec 11, 2018 · 27 comments

Comments

@tito
Copy link
Member

tito commented Dec 11, 2018

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
Copy link

ghost commented Dec 11, 2018

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
Copy link
Contributor

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

@inclement
Copy link
Member

@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
Copy link
Contributor

brentpicasso commented Jul 12, 2019

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
Copy link
Contributor

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
Copy link
Member

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:

  • it would make the APK much bigger. Most of the current size is stuff that would need to be recompiled for each arch. I wouldn't be surprised if supporting two archs almost doubled the APK size.
  • it needs some technical problem solving to unpack and load Python with the right modules, that should be possible but will need a little thought.
    It would be fine for this

@ghost
Copy link

ghost commented Jul 13, 2019

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
Copy link
Member

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
Copy link

ghost commented Jul 13, 2019

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
Copy link
Member

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
Copy link
Contributor

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
Copy link

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
Copy link
Member

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
Copy link
Contributor

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
Copy link
Member

@SomberNight tito has created a PR at kivy/buildozer#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
Copy link
Contributor

brentpicasso commented Sep 1, 2019

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
Copy link
Member Author

tito commented Sep 1, 2019

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

@snmsung716
Copy link

snmsung716 commented Sep 5, 2019

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 = '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

@inclement
Copy link
Member

inclement commented Sep 5, 2019 via email

@snmsung716
Copy link

snmsung716 commented Sep 5, 2019

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

  • master dd69749 [origin/master] Merge pull request 1955 from kivy/release-2019.08.09
    Run '/usr/bin/python3 -m pip install -q --user 'appdirs' 'colorama>=0.3.3' 'jinja2' 'six' 'enum34; python_version<"3.4"' 'sh>=1.10; sys_platform!="nt"' 'pep517' 'pytoml' 'virtualenv''
    Cwd None
    Apache ANT found at /home/userName/.buildozer/android/platform/apache-ant-1.9.4
    Android SDK found at /home/userName/.buildozer/android/platform/android-sdk
    Recommended android's NDK version by p4a is: 17c
    Android NDK found at /home/userName/.buildozer/android/platform/android-ndk-r17c
    Check application requirements
    Check garden requirements
    Compile platform
    Run '/usr/bin/python3 -m pythonforandroid.toolchain create --dist_name=myapp --bootstrap=sdl2 --requirements=python3,kivy,pyjnius,requests --arch armeabi-v7a, arm64-v8a --copy-libs --color=always --storage-dir="/home/userName/Desktop/kivy/kivy_v7a_v8a/.buildozer/android/platform/build" --ndk-api=21'
    Cwd /home/userName/Desktop/kivy/kivy_v7a_v8a/.buildozer/android/platform/python-for-android
    [INFO]: Will compile for the following archs: armeabi-v7a
    [INFO]: Found Android API target in $ANDROIDAPI: 28
    [INFO]: Available Android APIs are (28)
    [INFO]: Requested API target 28 is available, continuing.
    [INFO]: Found NDK dir in $ANDROIDNDK: /home/userName/.buildozer/android/platform/android-ndk-r17c
    [INFO]: Found NDK version 17c
    [INFO]: Getting NDK API version (i.e. minimum supported API) from user argument
    [INFO]: Found virtualenv at /usr/local/bin/virtualenv
    [INFO]: ccache is missing, the build will not be optimized in the future.
    [INFO]: Found the following toolchain versions: ['4.9']
    [INFO]: Picking the latest gcc toolchain, here 4.9
    [INFO]: Of the existing distributions, the following meet the given requirements:
    [INFO]: myapp: min API 21, includes recipes (hostpython3, libffi, openssl, sdl2_image, sdl2_mixer, sdl2_ttf, sqlite3, python3, sdl2, setuptools, requests, six, pyjnius, android, kivy), built for archs (armeabi-v7a)
    [INFO]: myapp has compatible recipes, using this one
    Build the application 5
    Copy application source from /home/userName/Desktop/kivy/kivy_v7a_v8a
    Create directory /home/userName/Desktop/kivy/kivy_v7a_v8a/.buildozer/android/app
    Copy /home/userName/Desktop/kivy/kivy_v7a_v8a/main.py
    Copy /home/userName/Desktop/kivy/kivy_v7a_v8a/main.kv
    Copy /home/userName/Desktop/kivy/kivy_v7a_v8a/reference.py
    Create directory /home/userName/Desktop/kivy/kivy_v7a_v8a/.buildozer/android/app/data
    Copy /home/userName/Desktop/kivy/kivy_v7a_v8a/icons/slope1.jpg
    Copy /home/userName/Desktop/kivy/kivy_v7a_v8a/icons/investor2.jpg
    Copy /home/userName/Desktop/kivy/kivy_v7a_v8a/icons/museum1.jpg
    Create directory /home/userName/Desktop/kivy/kivy_v7a_v8a/.buildozer/android/app/kv
    Copy /home/userName/Desktop/kivy/kivy_v7a_v8a/kv/saveScreen700.kv
    Copy /home/userName/Desktop/kivy/kivy_v7a_v8a/kv/startscreen.kv
    Copy /home/userName/Desktop/kivy/kivy_v7a_v8a/kv/saveScreen800.kv
    Copy /home/userName/Desktop/kivy/kivy_v7a_v8a/kv/loveSetting.kv
    Copy /home/userName/Desktop/kivy/kivy_v7a_v8a/kv/saveScreen.kv
    Copy /home/userName/Desktop/kivy/kivy_v7a_v8a/kv/settingsscreen.kv
    Copy /home/userName/Desktop/kivy/kivy_v7a_v8a/kv/dictionaryScreen.kv
    Copy /home/userName/Desktop/kivy/kivy_v7a_v8a/kv/listScreen.kv
    Copy /home/userName/Desktop/kivy/kivy_v7a_v8a/kv/loveHome.kv
    Copy /home/userName/Desktop/kivy/kivy_v7a_v8a/kv/saveScreen900.kv
    Copy /home/userName/Desktop/kivy/kivy_v7a_v8a/kv/homescreen.kv
    Package the application
    project.properties updated
    Gradle project detected, copy files /home/userName/Desktop/kivy/kivy_v7a_v8a/.buildozer/android/platform/build/dists/myapp/src/main/java
    Run '/usr/bin/python3 -m pythonforandroid.toolchain apk --debug --bootstrap=sdl2 --dist_name myapp --name '포켓단어장' --version 1.5 --package org.englishapp.myapp --android_api 28 --minsdk 21 --ndk-api 21 --private /home/userName/Desktop/kivy/kivy_v7a_v8a/.buildozer/android/app --permission WRITE_EXTERNAL_STORAGE --permission READ_EXTERNAL_STORAGE --permission INTERNET --icon /home/userName/Desktop/kivy/kivy_v7a_v8a/./data/icon.png --orientation portrait --window --copy-libs --arch armeabi-v7a, arm64-v8a --color=always --storage-dir="/home/userName/Desktop/kivy/kivy_v7a_v8a/.buildozer/android/platform/build" --ndk-api=21'
    Cwd /home/userName/Desktop/kivy/kivy_v7a_v8a/.buildozer/android/platform/python-for-android
    [INFO]: Will compile for the following archs: armeabi-v7a
    [INFO]: Getting Android API version from user argument: 28
    [INFO]: Available Android APIs are (28)
    [INFO]: Requested API target 28 is available, continuing.
    [INFO]: Found NDK dir in $ANDROIDNDK: /home/userName/.buildozer/android/platform/android-ndk-r17c
    [INFO]: Found NDK version 17c
    [INFO]: Getting NDK API version (i.e. minimum supported API) from user argument
    [INFO]: Found virtualenv at /usr/local/bin/virtualenv
    [INFO]: ccache is missing, the build will not be optimized in the future.
    [INFO]: Found the following toolchain versions: ['4.9']
    [INFO]: Picking the latest gcc toolchain, here 4.9
    [INFO]: Of the existing distributions, the following meet the given requirements:
    [INFO]: myapp: min API 21, includes recipes (hostpython3, libffi, openssl, sdl2_image, sdl2_mixer, sdl2_ttf, sqlite3, python3, sdl2, setuptools, requests, six, pyjnius, android, kivy), built for archs (armeabi-v7a)
    [INFO]: myapp has compatible recipes, using this one
    [INFO]: Of the existing distributions, the following meet the given requirements:
    [INFO]: myapp: min API 21, includes recipes (hostpython3, libffi, openssl, sdl2_image, sdl2_mixer, sdl2_ttf, sqlite3, python3, sdl2, setuptools, requests, six, pyjnius, android, kivy), built for archs (armeabi-v7a)
    [INFO]: myapp has compatible recipes, using this one
    [INFO]: -> directory context /home/userName/Desktop/kivy/kivy_v7a_v8a/.buildozer/android/platform/build/dists/myapp
    usage: toolchain.py [-h] [--private PRIVATE] --package PACKAGE --name NAME
    [--numeric-version NUMERIC_VERSION] --version VERSION
    [--launcher] [--permission PERMISSIONS [PERMISSIONS ...]]
    [--meta-data META_DATA] [--uses-library ANDROID_USED_LIBS]
    [--icon ICON] [--service SERVICES] [--presplash PRESPLASH]
    [--presplash-color PRESPLASH_COLOR] [--window]
    [--orientation ORIENTATION] [--wakelock]
    [--blacklist BLACKLIST] [--whitelist WHITELIST]
    [--add-jar ADD_JAR] [--add-aar ADD_AAR] [--depend DEPENDS]
    [--sdk SDK_VERSION] [--minsdk MIN_SDK_VERSION]
    [--allow-minsdk-ndkapi-mismatch]
    [--intent-filters INTENT_FILTERS]
    [--with-billing BILLING_PUBKEY]
    [--add-source EXTRA_SOURCE_DIRS]
    [--try-system-python-compile] [--no-compile-pyo] [--sign]
    [--add-activity ADD_ACTIVITY]
    [--activity-launch-mode ACTIVITY_LAUNCH_MODE]
    [--allow-backup ALLOW_BACKUP] [--no-optimize-python]
    toolchain.py: error: unrecognized arguments: arm64-v8a
    Command failed: /usr/bin/python3 -m pythonforandroid.toolchain apk --debug --bootstrap=sdl2 --dist_name myapp --name '포켓단어장' --version 1.5 --package org.englishapp.myapp --android_api 28 --minsdk 21 --ndk-api 21 --private /home/userName/Desktop/kivy/kivy_v7a_v8a/.buildozer/android/app --permission WRITE_EXTERNAL_STORAGE --permission READ_EXTERNAL_STORAGE --permission INTERNET --icon /home/userName/Desktop/kivy/kivy_v7a_v8a/./data/icon.png --orientation portrait --window --copy-libs --arch armeabi-v7a, arm64-v8a --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'
    LC_PAPER = 'ja_JP.UTF-8'
    LC_MONETARY = 'ja_JP.UTF-8'
    LANG = 'en_US.UTF-8'
    DISPLAY = ':0.0'
    COLORTERM = 'truecolor'
    LC_NAME = 'ja_JP.UTF-8'
    HOME = '/home/userName'
    LC_ADDRESS = 'ja_JP.UTF-8'
    LC_NUMERIC = 'ja_JP.UTF-8'
    TERM = 'xterm-256color'
    LANGUAGE = 'en_US'
    LC_TELEPHONE = 'ja_JP.UTF-8'
    XAUTHORITY = '/home/userName/.Xauthority'
    PATH = '/home/userName/.buildozer/android/platform/apache-ant-1.9.4/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin'
    LC_IDENTIFICATION = 'ja_JP.UTF-8'
    LC_TIME = 'ja_JP.UTF-8'
    MAIL = '/var/mail/root'
    LOGNAME = 'root'
    USER = 'root'
    USERNAME = 'root'
    SHELL = '/bin/bash'
    SUDO_COMMAND = '/usr/local/bin/buildozer android debug'
    SUDO_USER = 'userName'
    SUDO_UID = '1000'
    SUDO_GID = '1000'
    PACKAGES_PATH = '/home/userName/.buildozer/android/packages'
    ANDROIDSDK = '/home/userName/.buildozer/android/platform/android-sdk'
    ANDROIDNDK = '/home/userName/.buildozer/android/platform/android-ndk-r17c'
    ANDROIDAPI = '28'
    ANDROIDMINAPI = '21'

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

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
Copy link

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
Copy link

Fak3 commented Sep 11, 2019

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
Copy link
Member

@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
Copy link

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

@inclement
Copy link
Member

inclement commented Aug 3, 2020 via email

@Munts-lab
Copy link

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
Copy link
Member

misl6 commented Apr 6, 2022

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

@misl6 misl6 closed this as completed Apr 6, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests