From 42295bbe154e86e53b1aca71728d65e6605b2b58 Mon Sep 17 00:00:00 2001 From: Julian-o Date: Sat, 25 Nov 2023 03:00:54 +1100 Subject: [PATCH 1/4] Use latest Buildozer.spec Reapply same changes, plus: osx.kivy_version now 2.2.1 accepts android.accept_sdk_license = True Cython version restricted (will be installed by Buildozer in its next release) Note: android.archs now new default --- packaging/buildozer.spec | 215 +++++++++++++++++++++++++++++---------- 1 file changed, 160 insertions(+), 55 deletions(-) diff --git a/packaging/buildozer.spec b/packaging/buildozer.spec index 06ca7b0..3e711d2 100644 --- a/packaging/buildozer.spec +++ b/packaging/buildozer.spec @@ -1,3 +1,8 @@ +# 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 @@ -12,19 +17,20 @@ package.domain = org.kivy # (str) Source code where the main.py live source.dir = ../kivy_pong_demo -# (list) Source files to include (let empty to include all the files) +# (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 (let empty to not exclude anything) +# (list) Source files to exclude (leave empty to not exclude anything) #source.exclude_exts = spec -# (list) List of directory to exclude (let empty to not exclude anything) +# (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) @@ -48,10 +54,17 @@ requirements = python3,kivy # (str) Icon of the application #icon.filename = %(source.dir)s/data/icon.png -# (str) Supported orientation (one of landscape, sensorLandscape, portrait or all) +# (list) Supported orientations +# Valid options are: landscape, portrait, portrait-reverse or landscape-reverse orientation = portrait -# (list) List of service to declare +# (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 # @@ -61,11 +74,8 @@ orientation = portrait # # 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 +osx.kivy_version = 2.2.1 # # Android specific @@ -87,30 +97,32 @@ fullscreen = 0 # 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 -#android.permissions = INTERNET +# (See https://python-for-android.readthedocs.io/en/latest/buildoptions/#build-options-1 for all the supported syntaxes and properties) +#android.permissions = android.permission.INTERNET, (name=android.permission.WRITE_EXTERNAL_STORAGE;maxSdkVersion=18) # (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 = 27 +#android.api = 31 -# (int) Minimum API your APK will support. +# (int) Minimum API your APK / AAB will support. #android.minapi = 21 # (int) Android SDK version to use #android.sdk = 20 # (str) Android NDK version to use -#android.ndk = 19b +#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 -# (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 = @@ -120,7 +132,7 @@ fullscreen = 0 # (str) ANT directory (if empty, it will be automatically downloaded.) #android.ant_path = -# (bool) If True, then skip trying to update the Android sdk +# (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 @@ -129,10 +141,26 @@ fullscreen = 0 # 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 +android.accept_sdk_license = True # (str) Android entry point, default is ok for Kivy-based app -#android.entrypoint = org.renpy.android.PythonActivity +#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" @@ -140,6 +168,9 @@ fullscreen = 0 # (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 = @@ -159,23 +190,46 @@ fullscreen = 0 # (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 +# please enclose in double quotes # e.g. android.gradle_repositories = "maven { url 'https://kotlin.bintray.com/ktor' }" #android.add_gradle_repositories = -# (list) packaging options to add +# (list) packaging options to add # see https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.PackagingOptions.html # can be necessary to solve conflicts in gradle_dependencies -# please enclose in double quotes +# 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 = @@ -192,9 +246,16 @@ fullscreen = 0 # (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 @@ -228,8 +289,9 @@ fullscreen = 0 # (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 +# (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 @@ -247,6 +309,15 @@ android.allow_backup = True # 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 # @@ -258,9 +329,12 @@ android.allow_backup = True #p4a.fork = kivy # (str) python-for-android branch to use, defaults to master -#p4a.branch = master +p4a.branch = release-2022.12.20 -# (str) python-for-android git clone directory (if empty, it will be automatically cloned from github) +# (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) @@ -270,6 +344,7 @@ android.allow_backup = True #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) @@ -282,6 +357,10 @@ android.allow_backup = True # 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 @@ -298,7 +377,7 @@ ios.kivy_ios_branch = master #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.10.0 +ios.ios_deploy_branch = 1.12.2 # (bool) Whether or not to sign the code ios.codesign.allowed = false @@ -316,6 +395,18 @@ ios.codesign.allowed = false # (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] @@ -328,43 +419,57 @@ 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 +# (str) Path to build output (i.e. .apk, .aab, .ipa) storage # bin_dir = ./bin -# ----------------------------------------------------------------------------- -# List as sections +#----------------------------------------------------------------------------- +# Notes about using this file: # -# 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: +# 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 # -#[app] -#source.exclude_patterns = license,data/audio/*.wav,data/images/original/* +# Warning: Comments cannot be used "inline" - i.e. +# [app] +# title = My Application # This is not a comment, it is part of the title. # -# This can be translated into: +# 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. # -#[app:source.exclude_patterns] -#license -#data/audio/*.wav -#data/images/original/* +# Buildozer's .spec files have some additional features: # - - -# ----------------------------------------------------------------------------- -# Profiles +# 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. # -# 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@demo] -#title = My Application (demo) +# [app:source.exclude_patterns@demo] +# images/hd/* # -#[app:source.exclude_patterns@demo] -#images/hd/* +# Then, invoke the command line with the "demo" profile: # -# Then, invoke the command line with the "demo" profile: +# buildozer --profile demo android debug # -#buildozer --profile demo android debug +# Environment variable overrides have priority over profile overrides. From 7055f75cbd8fffdc7f77f71e142654f09a42cb57 Mon Sep 17 00:00:00 2001 From: Julian-o Date: Sat, 25 Nov 2023 04:21:22 +1100 Subject: [PATCH 2/4] Work with p4a master --- packaging/buildozer.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/buildozer.spec b/packaging/buildozer.spec index 3e711d2..a31e9c4 100644 --- a/packaging/buildozer.spec +++ b/packaging/buildozer.spec @@ -329,7 +329,7 @@ android.allow_backup = True #p4a.fork = kivy # (str) python-for-android branch to use, defaults to master -p4a.branch = release-2022.12.20 +# p4a.branch = master # (str) python-for-android specific commit to use, defaults to HEAD, must be within p4a.branch #p4a.commit = HEAD From 9ecc54451d5e8064c345e6cb5f7010804465ad82 Mon Sep 17 00:00:00 2001 From: Julian-o Date: Sat, 25 Nov 2023 04:50:31 +1100 Subject: [PATCH 3/4] Reapply Cython version restriction --- packaging/buildozer.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/buildozer.spec b/packaging/buildozer.spec index a31e9c4..04e0cf0 100644 --- a/packaging/buildozer.spec +++ b/packaging/buildozer.spec @@ -42,7 +42,7 @@ version.filename = %(source.dir)s/__init__.py # (list) Application requirements # comma separated e.g. requirements = sqlite3,kivy -requirements = python3,kivy +requirements = python3,kivy,Cython==0.29.36 # (str) Custom source folders for requirements # Sets custom source for any requirements with recipes From cf8952ca6fe84c8ce8d5f8396752fab7eba30426 Mon Sep 17 00:00:00 2001 From: Julian-o Date: Sat, 25 Nov 2023 14:47:51 +1100 Subject: [PATCH 4/4] Revert to hardcoded p4a CI Build depends on 3rd Party GitHub build action that depends on obsolete Docker image on DockerHub that still includes old version of Cython that doesn't work with stable or master versions of p4a. --- packaging/buildozer.spec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/buildozer.spec b/packaging/buildozer.spec index 04e0cf0..3e711d2 100644 --- a/packaging/buildozer.spec +++ b/packaging/buildozer.spec @@ -42,7 +42,7 @@ version.filename = %(source.dir)s/__init__.py # (list) Application requirements # comma separated e.g. requirements = sqlite3,kivy -requirements = python3,kivy,Cython==0.29.36 +requirements = python3,kivy # (str) Custom source folders for requirements # Sets custom source for any requirements with recipes @@ -329,7 +329,7 @@ android.allow_backup = True #p4a.fork = kivy # (str) python-for-android branch to use, defaults to master -# p4a.branch = master +p4a.branch = release-2022.12.20 # (str) python-for-android specific commit to use, defaults to HEAD, must be within p4a.branch #p4a.commit = HEAD