From 179d93eac4181b509f12f610127a646d3e4fde0c Mon Sep 17 00:00:00 2001 From: Ivan Date: Fri, 17 Apr 2026 23:28:28 -0500 Subject: [PATCH] feat(android): update Android build process by adding SDK setup for Chaquopy native wheels and enabling ABI selection for builds --- .github/workflows/android-build.yml | 20 +++++++++++++++++++- android/app/build.gradle | 25 +++++++++++++++++++++---- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/.github/workflows/android-build.yml b/.github/workflows/android-build.yml index e3296d1..01c98cc 100644 --- a/.github/workflows/android-build.yml +++ b/.github/workflows/android-build.yml @@ -93,8 +93,26 @@ jobs: ./rustup-init.sh -y --profile minimal --default-toolchain stable echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" + - name: Set up Android SDK for Chaquopy native wheels + run: | + set -euo pipefail + SDK_ROOT="${RUNNER_TEMP}/android-sdk" + mkdir -p "${SDK_ROOT}/cmdline-tools" + curl -fsSL -o /tmp/android-cmdline-tools.zip \ + "https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip" + unzip -q /tmp/android-cmdline-tools.zip -d /tmp + rm -f /tmp/android-cmdline-tools.zip + mv /tmp/cmdline-tools "${SDK_ROOT}/cmdline-tools/latest" + yes | "${SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager" --sdk_root="${SDK_ROOT}" --licenses >/dev/null + yes | "${SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager" --sdk_root="${SDK_ROOT}" \ + "ndk;27.3.13750724" "platform-tools" >/dev/null + { + echo "ANDROID_HOME=${SDK_ROOT}" + echo "ANDROID_SDK_ROOT=${SDK_ROOT}" + } >> "${GITHUB_ENV}" + - name: Build Android wheels - run: bash scripts/build-android-wheels-local.sh --python-minor "${PYTHON_VERSION}" --chaquopy-ref "${CHAQUOPY_REF}" + run: bash scripts/build-android-wheels-local.sh --python-minor "${PYTHON_VERSION}" --chaquopy-ref "${CHAQUOPY_REF}" --abis arm64-v8a,x86_64,armeabi-v7a - name: Run unit tests if: ${{ github.event_name != 'workflow_dispatch' || inputs.run_tests }} diff --git a/android/app/build.gradle b/android/app/build.gradle index 95cf2a9..1988509 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -9,6 +9,21 @@ def chaquopyBuildPython = System.getenv("CHAQUOPY_BUILD_PYTHON") def pythonTempDir = new File(buildDir, "python-tmp") def vendorWheelDir = new File(rootProject.projectDir, "vendor") def lxstPatchedWheel = new File(rootProject.projectDir, "vendor/lxst-0.4.6-py3-none-any.whl") +def allAndroidAbis = ["arm64-v8a", "x86_64", "armeabi-v7a"] +def selectedAndroidAbis = ( + project.findProperty("meshchatxAbis") + ?: System.getenv("MESHCHATX_ABIS") + ?: allAndroidAbis.join(",") +).split(",").collect { it.trim() }.findAll { it } + +if (selectedAndroidAbis.isEmpty()) { + throw new org.gradle.api.GradleException("No Android ABIs selected. Use -PmeshchatxAbis or MESHCHATX_ABIS.") +} +def invalidAndroidAbis = selectedAndroidAbis.findAll { !allAndroidAbis.contains(it) } +if (!invalidAndroidAbis.isEmpty()) { + throw new org.gradle.api.GradleException("Unsupported ABIs: ${invalidAndroidAbis}. Supported: ${allAndroidAbis}") +} +def enableAbiSplits = selectedAndroidAbis.size() > 1 android { namespace 'com.meshchatx' @@ -23,16 +38,18 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ndk { - abiFilters "arm64-v8a", "x86_64" + abiFilters(*selectedAndroidAbis as String[]) } } splits { abi { - enable true + enable enableAbiSplits reset() - include "arm64-v8a", "x86_64" - universalApk true + if (enableAbiSplits) { + include(*selectedAndroidAbis as String[]) + } + universalApk enableAbiSplits } }