diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 08e1463..828be5b 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -22,8 +22,11 @@ jobs: echo "$SIGNING_KEY" | gpg --dearmor > ${HOME}/secring.gpg - name: Install Android NDK - # The NDK the Android Gradle plugin uses, which builds every Android native library - run: yes | "$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" --install "ndk;28.2.13676358" + # Runners preset ANDROID_NDK_HOME to an older NDK, which KonanPlugin prefers over the Android + # Gradle plugin's; point it at NDK 28, whose linker aligns to 16 KB pages by default. + run: | + yes | "$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" --install "ndk;28.2.13676358" > /dev/null + echo "ANDROID_NDK_HOME=$ANDROID_HOME/ndk/28.2.13676358" >> "$GITHUB_ENV" - name: Setup Gradle uses: gradle/actions/setup-gradle@v3 @@ -33,6 +36,11 @@ jobs: with: xcode-version: latest-stable + - name: Check 16 KB page alignment + run: | + ./gradlew --no-configuration-cache :soundfont:bundleAndroidMainAar + scripts/check-16kb-alignment.sh soundfont/build/outputs/aar/soundfont.aar + - name: Publish To Maven Central env: ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.MAVEN_CENTRAL_USERNAME }} diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index b8f5608..655ea11 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -23,6 +23,13 @@ jobs: distribution: 'zulu' java-version: '17' + - name: Install Android NDK + # Runners preset ANDROID_NDK_HOME to an older NDK, which KonanPlugin prefers over the Android + # Gradle plugin's; point it at NDK 28, whose linker aligns to 16 KB pages by default. + run: | + yes | "$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" --install "ndk;28.2.13676358" > /dev/null + echo "ANDROID_NDK_HOME=$ANDROID_HOME/ndk/28.2.13676358" >> "$GITHUB_ENV" + - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 @@ -37,6 +44,11 @@ jobs: - name: Run tests run: ./gradlew :soundfont:linuxX64Test + - name: Check 16 KB page alignment + run: | + ./gradlew :soundfont:bundleAndroidMainAar + scripts/check-16kb-alignment.sh soundfont/build/outputs/aar/soundfont.aar + - name: Upload test reports if: failure() uses: actions/upload-artifact@v4 diff --git a/scripts/check-16kb-alignment.sh b/scripts/check-16kb-alignment.sh new file mode 100755 index 0000000..6799bb4 --- /dev/null +++ b/scripts/check-16kb-alignment.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env sh +# Fails unless every 64-bit native library in the given AAR has 16 KB aligned LOAD segments, +# which Google Play requires for Android 15+ devices with 16 KB pages. +# Usage: scripts/check-16kb-alignment.sh path/to/library.aar +set -eu + +aar=$1 +readelf=$(ls "${ANDROID_NDK_HOME:?set ANDROID_NDK_HOME}"/toolchains/llvm/prebuilt/*/bin/llvm-readelf | head -1) +work=$(mktemp -d) +trap 'rm -rf "$work"' EXIT +unzip -q "$aar" 'jni/*' -d "$work" + +status=0 +for so in "$work"/jni/arm64-v8a/*.so "$work"/jni/x86_64/*.so; do + [ -e "$so" ] || { echo "missing 64-bit libraries in $aar"; exit 1; } + for align in $("$readelf" -lW "$so" | awk '$1 == "LOAD" { print $NF }'); do + if [ $((align)) -lt 16384 ]; then + echo "FAIL ${so#"$work"/}: LOAD segment aligned to $align" + status=1 + fi + done + [ $status -eq 0 ] && echo "ok ${so#"$work"/}" +done +exit $status