From 32bdca90150bd0e223098f59a2a86b36b7f6575f Mon Sep 17 00:00:00 2001 From: rdb Date: Sat, 8 Nov 2025 23:55:52 +0100 Subject: [PATCH] android: Work on API level 36 support (though target 35 for now) --- .github/workflows/ci.yml | 4 ++-- direct/src/dist/FreezeTool.py | 3 +++ direct/src/dist/_android.py | 2 ++ direct/src/dist/commands.py | 2 +- direct/src/dist/installers.py | 2 +- dtool/src/dtoolbase/memoryHook.cxx | 3 +++ makepanda/makepanda.py | 5 +++++ 7 files changed, 17 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 066cb3c4a4..6e56441a51 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -633,7 +633,7 @@ jobs: uses: actions/cache/restore@v4 with: path: ./thirdparty - key: cache-android-thirdparty-afc7ad98aee90da0f2f6bad826a41f9b71e0cdd0-${{ matrix.android-abi }}-ndk${{ matrix.ndk-version }} + key: cache-android-thirdparty-935c80380ca171e08587c570e9dad678d29db3c8-${{ matrix.android-abi }}-ndk${{ matrix.ndk-version }} - name: Install yasm if: steps.cache-android-thirdparty-restore.outputs.cache-hit != 'true' @@ -642,7 +642,7 @@ jobs: - name: Build thirdparty packages if: steps.cache-android-thirdparty-restore.outputs.cache-hit != 'true' run: | - git clone --revision=afc7ad98aee90da0f2f6bad826a41f9b71e0cdd0 --depth=1 https://github.com/rdb/panda3d-thirdparty.git thirdparty + git clone --revision=935c80380ca171e08587c570e9dad678d29db3c8 --depth=1 https://github.com/rdb/panda3d-thirdparty.git thirdparty cd thirdparty cmake -B build \ -DCMAKE_BUILD_TYPE=Release \ diff --git a/direct/src/dist/FreezeTool.py b/direct/src/dist/FreezeTool.py index 37b697f878..a56df6f951 100644 --- a/direct/src/dist/FreezeTool.py +++ b/direct/src/dist/FreezeTool.py @@ -1970,6 +1970,9 @@ class Freezer: elif self.platform.endswith('_aarch64') or self.platform.endswith('_arm64'): # Most arm64 operating systems are configured with 16 KiB pages. blob_align = 16384 + elif self.platform.replace('-', '_') == 'android_x86_64': + # Android nowadays requires 16 KiB pages on 64-bit Intel as well. + blob_align = 16384 else: # Align to page size, so that it can be mmapped. blob_align = 4096 diff --git a/direct/src/dist/_android.py b/direct/src/dist/_android.py index bebb7bf9df..98a88f1fcd 100644 --- a/direct/src/dist/_android.py +++ b/direct/src/dist/_android.py @@ -174,6 +174,7 @@ ANDROID_ATTRIBUTES = { 'debuggable': bool_resource(0x0101000f), 'documentLaunchMode': enum_resource(0x1010445, "none", "intoExisting", "always", "never"), 'enabled': bool_resource(0x101000e), + 'enableOnBackInvokedCallback': bool_resource(0x0101066c), 'excludeFromRecents': bool_resource(0x1010017), 'exported': bool_resource(0x1010010), 'extractNativeLibs': bool_resource(0x10104ea), @@ -195,6 +196,7 @@ ANDROID_ATTRIBUTES = { 'multiprocess': bool_resource(0x1010013), 'name': str_resource(0x1010003), 'noHistory': bool_resource(0x101022d), + 'pageSizeCompat': bool_resource(0x010106ab), 'pathPattern': str_resource(0x101002c), 'preferMinimalPostProcessing': bool_resource(0x101060c), 'required': bool_resource(0x101028e), diff --git a/direct/src/dist/commands.py b/direct/src/dist/commands.py index 2ba9524c8b..51a7face50 100644 --- a/direct/src/dist/commands.py +++ b/direct/src/dist/commands.py @@ -300,7 +300,7 @@ class build_apps(setuptools.Command): self.android_version_code = 1 self.android_min_sdk_version = 21 self.android_max_sdk_version = None - self.android_target_sdk_version = 36 + self.android_target_sdk_version = 35 self.android_manifest_file = None self.gui_apps = {} self.console_apps = {} diff --git a/direct/src/dist/installers.py b/direct/src/dist/installers.py index f09cef7841..1e1ee5d8ea 100644 --- a/direct/src/dist/installers.py +++ b/direct/src/dist/installers.py @@ -251,7 +251,7 @@ def create_aab(command, basename, build_dir): entry.entry_id.id = entry_id entry.name = res_name - for density, tag in (160, 'mdpi'), (240, 'hdpi'), (320, 'xhdpi'), (480, 'xxhdpi'), (640, 'xxxhdpi'): + for density, tag in (120, 'ldpi'), (160, 'mdpi'), (240, 'hdpi'), (320, 'xhdpi'), (480, 'xxhdpi'), (640, 'xxxhdpi'): path = f'res/mipmap-{tag}-v4/{res_name}.png' if (build_dir_fn / path).exists(): bundle.add_subfile('base/' + path, build_dir_fn / path, 0) diff --git a/dtool/src/dtoolbase/memoryHook.cxx b/dtool/src/dtoolbase/memoryHook.cxx index 37b36d8633..b2c51c06a0 100644 --- a/dtool/src/dtoolbase/memoryHook.cxx +++ b/dtool/src/dtoolbase/memoryHook.cxx @@ -618,6 +618,9 @@ determine_page_size() const { _page_size = (size_t)sysinfo.dwPageSize; +#elif defined(ANDROID) + _page_size = getpagesize(); + #else // Posix case. _page_size = sysconf(_SC_PAGESIZE); diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index b9f68d9c1a..9c1a14f081 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -1906,6 +1906,11 @@ def CompileLink(dll, obj, opts): cmd += " -march=armv7-a -Wl,--fix-cortex-a8" elif arch == 'mips': cmd += ' -mips32' + + if arch.endswith('64'): + # See https://developer.android.com/guide/practices/page-sizes + cmd += ' -Wl,-z,max-page-size=16384' + cmd += ' -lc -lm' elif GetTarget() == 'emscripten':