From fb1f187d090a3753e0004d3755e8b7e1a60b7879 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Tue, 27 Jan 2026 21:35:27 +0200 Subject: [PATCH 01/11] Update Android emulator API level to 36 --- .github/workflows/scripts-android.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scripts-android.yml b/.github/workflows/scripts-android.yml index 1537fd0807..6247879507 100644 --- a/.github/workflows/scripts-android.yml +++ b/.github/workflows/scripts-android.yml @@ -141,7 +141,7 @@ jobs: - name: Run Android instrumentation tests uses: reactivecircus/android-emulator-runner@v2 with: - api-level: 31 + api-level: 36 arch: x86_64 target: google_apis disk-size: 2048M From b3686b8f7f1f1dc1dae397585d134b70119d06c0 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Wed, 28 Jan 2026 04:25:41 +0200 Subject: [PATCH 02/11] Align Android build scripts with API 36 --- scripts/android/lib/PatchGradleFiles.java | 4 ++-- scripts/build-android-app.sh | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/scripts/android/lib/PatchGradleFiles.java b/scripts/android/lib/PatchGradleFiles.java index 3bf2ef2643..b2204511f8 100644 --- a/scripts/android/lib/PatchGradleFiles.java +++ b/scripts/android/lib/PatchGradleFiles.java @@ -356,8 +356,8 @@ private static class Arguments { static Arguments parse(String[] args) { Path root = null; Path app = null; - int compileSdk = 33; - int targetSdk = 33; + int compileSdk = 36; + int targetSdk = 36; for (int i = 0; i < args.length; i++) { String arg = args[i]; switch (arg) { diff --git a/scripts/build-android-app.sh b/scripts/build-android-app.sh index 6d90a33c53..b467f662ff 100755 --- a/scripts/build-android-app.sh +++ b/scripts/build-android-app.sh @@ -140,8 +140,8 @@ fi "$PATCH_GRADLE_JAVA" "$PATCH_GRADLE_SOURCE_PATH/$PATCH_GRADLE_MAIN_CLASS.java" \ --root "$ROOT_BUILD_GRADLE" \ --app "$APP_BUILD_GRADLE" \ - --compile-sdk 33 \ - --target-sdk 33 + --compile-sdk 36 \ + --target-sdk 36 # --- END: robust Gradle patch --- echo "----- app/build.gradle tail -----" @@ -155,8 +155,12 @@ export JAVA_HOME="${JDK_HOME:-$JAVA17_HOME}" ( cd "$GRADLE_PROJECT_DIR" if command -v sdkmanager >/dev/null 2>&1; then + ba_log "Ensuring Android SDK platform 36 is installed" + yes | sdkmanager "platforms;android-36" >/dev/null 2>&1 || ba_log "Warning: unable to install Android platform 36" yes | sdkmanager --licenses >/dev/null 2>&1 || true elif [ -x "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" ]; then + ba_log "Ensuring Android SDK platform 36 is installed" + yes | "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" "platforms;android-36" >/dev/null 2>&1 || ba_log "Warning: unable to install Android platform 36" yes | "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" --licenses >/dev/null 2>&1 || true fi ./gradlew --no-daemon assembleDebug From 3fd2dd1a1d6e7916f616c606b705bc86e30840e5 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Wed, 28 Jan 2026 05:56:04 +0200 Subject: [PATCH 03/11] Ensure Android SDK 36 components for instrumentation tests --- scripts/run-android-instrumentation-tests.sh | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/scripts/run-android-instrumentation-tests.sh b/scripts/run-android-instrumentation-tests.sh index 06c6381d2e..74d33b1395 100755 --- a/scripts/run-android-instrumentation-tests.sh +++ b/scripts/run-android-instrumentation-tests.sh @@ -69,6 +69,24 @@ cn1ss_setup "$TARGET_JAVA_BIN" "$CN1SS_HELPER_SOURCE_DIR" [ -d "$GRADLE_PROJECT_DIR" ] || { ra_log "Gradle project directory not found: $GRADLE_PROJECT_DIR"; exit 4; } [ -x "$GRADLE_PROJECT_DIR/gradlew" ] || chmod +x "$GRADLE_PROJECT_DIR/gradlew" +ANDROID_SDK_ROOT="${ANDROID_SDK_ROOT:-${ANDROID_HOME:-}}" +if [ -z "$ANDROID_SDK_ROOT" ]; then + if [ -d "/usr/local/lib/android/sdk" ]; then ANDROID_SDK_ROOT="/usr/local/lib/android/sdk" + elif [ -d "$HOME/Android/Sdk" ]; then ANDROID_SDK_ROOT="$HOME/Android/Sdk"; fi +fi +if [ -n "$ANDROID_SDK_ROOT" ] && [ -d "$ANDROID_SDK_ROOT" ]; then + export ANDROID_SDK_ROOT ANDROID_HOME="$ANDROID_SDK_ROOT" + if command -v sdkmanager >/dev/null 2>&1; then + ra_log "Ensuring Android SDK platform 36 is installed" + yes | sdkmanager "platforms;android-36" "build-tools;36.0.0" >/dev/null 2>&1 || ra_log "Warning: unable to install Android SDK 36 components" + elif [ -x "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" ]; then + ra_log "Ensuring Android SDK platform 36 is installed" + yes | "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" "platforms;android-36" "build-tools;36.0.0" >/dev/null 2>&1 || ra_log "Warning: unable to install Android SDK 36 components" + fi +else + ra_log "Warning: Android SDK root not found; skipping SDK component installation" +fi + # ---- Prepare app + emulator state ----------------------------------------- MANIFEST="$GRADLE_PROJECT_DIR/app/src/main/AndroidManifest.xml" if [ ! -f "$MANIFEST" ]; then From 7aacb29bac837db6685c0f75aafd49f49e839711 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Wed, 28 Jan 2026 18:00:19 +0200 Subject: [PATCH 04/11] Fail fast when Android SDK 36 install is unavailable --- scripts/run-android-instrumentation-tests.sh | 25 ++++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/scripts/run-android-instrumentation-tests.sh b/scripts/run-android-instrumentation-tests.sh index 74d33b1395..ea7705a5cf 100755 --- a/scripts/run-android-instrumentation-tests.sh +++ b/scripts/run-android-instrumentation-tests.sh @@ -74,17 +74,28 @@ if [ -z "$ANDROID_SDK_ROOT" ]; then if [ -d "/usr/local/lib/android/sdk" ]; then ANDROID_SDK_ROOT="/usr/local/lib/android/sdk" elif [ -d "$HOME/Android/Sdk" ]; then ANDROID_SDK_ROOT="$HOME/Android/Sdk"; fi fi +SDKMANAGER_BIN="" if [ -n "$ANDROID_SDK_ROOT" ] && [ -d "$ANDROID_SDK_ROOT" ]; then export ANDROID_SDK_ROOT ANDROID_HOME="$ANDROID_SDK_ROOT" - if command -v sdkmanager >/dev/null 2>&1; then - ra_log "Ensuring Android SDK platform 36 is installed" - yes | sdkmanager "platforms;android-36" "build-tools;36.0.0" >/dev/null 2>&1 || ra_log "Warning: unable to install Android SDK 36 components" - elif [ -x "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" ]; then - ra_log "Ensuring Android SDK platform 36 is installed" - yes | "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" "platforms;android-36" "build-tools;36.0.0" >/dev/null 2>&1 || ra_log "Warning: unable to install Android SDK 36 components" + if [ -x "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" ]; then + SDKMANAGER_BIN="$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" + elif command -v sdkmanager >/dev/null 2>&1; then + SDKMANAGER_BIN="$(command -v sdkmanager)" + fi +fi + +if [ -n "$SDKMANAGER_BIN" ]; then + ra_log "Ensuring Android SDK platform 36 is installed" + SDK_INSTALL_LOG="$ARTIFACTS_DIR/sdkmanager-android-36.log" + if yes | "$SDKMANAGER_BIN" "platforms;android-36" "build-tools;36.0.0" >"$SDK_INSTALL_LOG" 2>&1; then + ra_log "Android SDK 36 components installed" + else + ra_log "FATAL: unable to install Android SDK 36 components (see $SDK_INSTALL_LOG)" >&2 + exit 6 fi else - ra_log "Warning: Android SDK root not found; skipping SDK component installation" + ra_log "FATAL: Android SDK root or sdkmanager not found; cannot install API 36 components" >&2 + exit 6 fi # ---- Prepare app + emulator state ----------------------------------------- From 8f82f96c8c52eaf7434dcb0b3b4d70da70e1a8c8 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Wed, 28 Jan 2026 18:29:15 +0200 Subject: [PATCH 05/11] Validate Android SDK 36 presence before tests --- scripts/run-android-instrumentation-tests.sh | 25 +++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/scripts/run-android-instrumentation-tests.sh b/scripts/run-android-instrumentation-tests.sh index ea7705a5cf..159b214feb 100755 --- a/scripts/run-android-instrumentation-tests.sh +++ b/scripts/run-android-instrumentation-tests.sh @@ -75,6 +75,8 @@ if [ -z "$ANDROID_SDK_ROOT" ]; then elif [ -d "$HOME/Android/Sdk" ]; then ANDROID_SDK_ROOT="$HOME/Android/Sdk"; fi fi SDKMANAGER_BIN="" +ANDROID_PLATFORM_DIR="${ANDROID_SDK_ROOT%/}/platforms/android-36" +ANDROID_BUILD_TOOLS_DIR="${ANDROID_SDK_ROOT%/}/build-tools/36.0.0" if [ -n "$ANDROID_SDK_ROOT" ] && [ -d "$ANDROID_SDK_ROOT" ]; then export ANDROID_SDK_ROOT ANDROID_HOME="$ANDROID_SDK_ROOT" if [ -x "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" ]; then @@ -84,17 +86,22 @@ if [ -n "$ANDROID_SDK_ROOT" ] && [ -d "$ANDROID_SDK_ROOT" ]; then fi fi -if [ -n "$SDKMANAGER_BIN" ]; then - ra_log "Ensuring Android SDK platform 36 is installed" - SDK_INSTALL_LOG="$ARTIFACTS_DIR/sdkmanager-android-36.log" - if yes | "$SDKMANAGER_BIN" "platforms;android-36" "build-tools;36.0.0" >"$SDK_INSTALL_LOG" 2>&1; then - ra_log "Android SDK 36 components installed" +if [ ! -d "$ANDROID_PLATFORM_DIR" ] || [ ! -d "$ANDROID_BUILD_TOOLS_DIR" ]; then + if [ -n "$SDKMANAGER_BIN" ]; then + ra_log "Ensuring Android SDK platform 36 is installed" + SDK_INSTALL_LOG="$ARTIFACTS_DIR/sdkmanager-android-36.log" + if yes | "$SDKMANAGER_BIN" "platforms;android-36" "build-tools;36.0.0" >"$SDK_INSTALL_LOG" 2>&1; then + ra_log "Android SDK 36 components installed" + else + ra_log "Warning: unable to install Android SDK 36 components (see $SDK_INSTALL_LOG)" + fi else - ra_log "FATAL: unable to install Android SDK 36 components (see $SDK_INSTALL_LOG)" >&2 - exit 6 + ra_log "Warning: Android SDK root or sdkmanager not found; cannot install API 36 components" fi -else - ra_log "FATAL: Android SDK root or sdkmanager not found; cannot install API 36 components" >&2 +fi + +if [ ! -d "$ANDROID_PLATFORM_DIR" ] || [ ! -d "$ANDROID_BUILD_TOOLS_DIR" ]; then + ra_log "FATAL: Android SDK 36 platform/build-tools not available at $ANDROID_SDK_ROOT" >&2 exit 6 fi From d71cbe6f26f868e043e405231d3f716ce92ae087 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Wed, 28 Jan 2026 20:21:12 +0200 Subject: [PATCH 06/11] Keep Android build targets at API 33 for now --- scripts/android/lib/PatchGradleFiles.java | 4 +-- scripts/build-android-app.sh | 8 ++---- scripts/run-android-instrumentation-tests.sh | 27 -------------------- 3 files changed, 4 insertions(+), 35 deletions(-) diff --git a/scripts/android/lib/PatchGradleFiles.java b/scripts/android/lib/PatchGradleFiles.java index b2204511f8..3bf2ef2643 100644 --- a/scripts/android/lib/PatchGradleFiles.java +++ b/scripts/android/lib/PatchGradleFiles.java @@ -356,8 +356,8 @@ private static class Arguments { static Arguments parse(String[] args) { Path root = null; Path app = null; - int compileSdk = 36; - int targetSdk = 36; + int compileSdk = 33; + int targetSdk = 33; for (int i = 0; i < args.length; i++) { String arg = args[i]; switch (arg) { diff --git a/scripts/build-android-app.sh b/scripts/build-android-app.sh index b467f662ff..6d90a33c53 100755 --- a/scripts/build-android-app.sh +++ b/scripts/build-android-app.sh @@ -140,8 +140,8 @@ fi "$PATCH_GRADLE_JAVA" "$PATCH_GRADLE_SOURCE_PATH/$PATCH_GRADLE_MAIN_CLASS.java" \ --root "$ROOT_BUILD_GRADLE" \ --app "$APP_BUILD_GRADLE" \ - --compile-sdk 36 \ - --target-sdk 36 + --compile-sdk 33 \ + --target-sdk 33 # --- END: robust Gradle patch --- echo "----- app/build.gradle tail -----" @@ -155,12 +155,8 @@ export JAVA_HOME="${JDK_HOME:-$JAVA17_HOME}" ( cd "$GRADLE_PROJECT_DIR" if command -v sdkmanager >/dev/null 2>&1; then - ba_log "Ensuring Android SDK platform 36 is installed" - yes | sdkmanager "platforms;android-36" >/dev/null 2>&1 || ba_log "Warning: unable to install Android platform 36" yes | sdkmanager --licenses >/dev/null 2>&1 || true elif [ -x "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" ]; then - ba_log "Ensuring Android SDK platform 36 is installed" - yes | "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" "platforms;android-36" >/dev/null 2>&1 || ba_log "Warning: unable to install Android platform 36" yes | "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" --licenses >/dev/null 2>&1 || true fi ./gradlew --no-daemon assembleDebug diff --git a/scripts/run-android-instrumentation-tests.sh b/scripts/run-android-instrumentation-tests.sh index 159b214feb..98dd4fdf4d 100755 --- a/scripts/run-android-instrumentation-tests.sh +++ b/scripts/run-android-instrumentation-tests.sh @@ -74,35 +74,8 @@ if [ -z "$ANDROID_SDK_ROOT" ]; then if [ -d "/usr/local/lib/android/sdk" ]; then ANDROID_SDK_ROOT="/usr/local/lib/android/sdk" elif [ -d "$HOME/Android/Sdk" ]; then ANDROID_SDK_ROOT="$HOME/Android/Sdk"; fi fi -SDKMANAGER_BIN="" -ANDROID_PLATFORM_DIR="${ANDROID_SDK_ROOT%/}/platforms/android-36" -ANDROID_BUILD_TOOLS_DIR="${ANDROID_SDK_ROOT%/}/build-tools/36.0.0" if [ -n "$ANDROID_SDK_ROOT" ] && [ -d "$ANDROID_SDK_ROOT" ]; then export ANDROID_SDK_ROOT ANDROID_HOME="$ANDROID_SDK_ROOT" - if [ -x "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" ]; then - SDKMANAGER_BIN="$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" - elif command -v sdkmanager >/dev/null 2>&1; then - SDKMANAGER_BIN="$(command -v sdkmanager)" - fi -fi - -if [ ! -d "$ANDROID_PLATFORM_DIR" ] || [ ! -d "$ANDROID_BUILD_TOOLS_DIR" ]; then - if [ -n "$SDKMANAGER_BIN" ]; then - ra_log "Ensuring Android SDK platform 36 is installed" - SDK_INSTALL_LOG="$ARTIFACTS_DIR/sdkmanager-android-36.log" - if yes | "$SDKMANAGER_BIN" "platforms;android-36" "build-tools;36.0.0" >"$SDK_INSTALL_LOG" 2>&1; then - ra_log "Android SDK 36 components installed" - else - ra_log "Warning: unable to install Android SDK 36 components (see $SDK_INSTALL_LOG)" - fi - else - ra_log "Warning: Android SDK root or sdkmanager not found; cannot install API 36 components" - fi -fi - -if [ ! -d "$ANDROID_PLATFORM_DIR" ] || [ ! -d "$ANDROID_BUILD_TOOLS_DIR" ]; then - ra_log "FATAL: Android SDK 36 platform/build-tools not available at $ANDROID_SDK_ROOT" >&2 - exit 6 fi # ---- Prepare app + emulator state ----------------------------------------- From 5ed66dc26d65eb4748209b4cab82cb549fe1b54b Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Wed, 28 Jan 2026 20:21:21 +0200 Subject: [PATCH 07/11] Re-enable API 36 targeting and capture Gradle logs --- scripts/android/lib/PatchGradleFiles.java | 4 ++-- scripts/build-android-app.sh | 8 +++++-- scripts/run-android-instrumentation-tests.sh | 24 ++++++++++++++++++-- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/scripts/android/lib/PatchGradleFiles.java b/scripts/android/lib/PatchGradleFiles.java index 3bf2ef2643..b2204511f8 100644 --- a/scripts/android/lib/PatchGradleFiles.java +++ b/scripts/android/lib/PatchGradleFiles.java @@ -356,8 +356,8 @@ private static class Arguments { static Arguments parse(String[] args) { Path root = null; Path app = null; - int compileSdk = 33; - int targetSdk = 33; + int compileSdk = 36; + int targetSdk = 36; for (int i = 0; i < args.length; i++) { String arg = args[i]; switch (arg) { diff --git a/scripts/build-android-app.sh b/scripts/build-android-app.sh index 6d90a33c53..98bef66732 100755 --- a/scripts/build-android-app.sh +++ b/scripts/build-android-app.sh @@ -140,8 +140,8 @@ fi "$PATCH_GRADLE_JAVA" "$PATCH_GRADLE_SOURCE_PATH/$PATCH_GRADLE_MAIN_CLASS.java" \ --root "$ROOT_BUILD_GRADLE" \ --app "$APP_BUILD_GRADLE" \ - --compile-sdk 33 \ - --target-sdk 33 + --compile-sdk 36 \ + --target-sdk 36 # --- END: robust Gradle patch --- echo "----- app/build.gradle tail -----" @@ -155,8 +155,12 @@ export JAVA_HOME="${JDK_HOME:-$JAVA17_HOME}" ( cd "$GRADLE_PROJECT_DIR" if command -v sdkmanager >/dev/null 2>&1; then + ba_log "Ensuring Android SDK platform/build-tools 36 are installed" + yes | sdkmanager "platforms;android-36" "build-tools;36.0.0" >/dev/null 2>&1 || ba_log "Warning: unable to install Android SDK 36 components" yes | sdkmanager --licenses >/dev/null 2>&1 || true elif [ -x "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" ]; then + ba_log "Ensuring Android SDK platform/build-tools 36 are installed" + yes | "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" "platforms;android-36" "build-tools;36.0.0" >/dev/null 2>&1 || ba_log "Warning: unable to install Android SDK 36 components" yes | "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" --licenses >/dev/null 2>&1 || true fi ./gradlew --no-daemon assembleDebug diff --git a/scripts/run-android-instrumentation-tests.sh b/scripts/run-android-instrumentation-tests.sh index 98dd4fdf4d..aa7bd4d721 100755 --- a/scripts/run-android-instrumentation-tests.sh +++ b/scripts/run-android-instrumentation-tests.sh @@ -76,6 +76,25 @@ if [ -z "$ANDROID_SDK_ROOT" ]; then fi if [ -n "$ANDROID_SDK_ROOT" ] && [ -d "$ANDROID_SDK_ROOT" ]; then export ANDROID_SDK_ROOT ANDROID_HOME="$ANDROID_SDK_ROOT" + SDKMANAGER_BIN="" + if [ -x "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" ]; then + SDKMANAGER_BIN="$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" + elif command -v sdkmanager >/dev/null 2>&1; then + SDKMANAGER_BIN="$(command -v sdkmanager)" + fi + if [ -n "$SDKMANAGER_BIN" ]; then + ra_log "Ensuring Android SDK platform/build-tools 36 are installed" + SDK_INSTALL_LOG="$ARTIFACTS_DIR/sdkmanager-android-36.log" + if yes | "$SDKMANAGER_BIN" "platforms;android-36" "build-tools;36.0.0" >"$SDK_INSTALL_LOG" 2>&1; then + ra_log "Android SDK 36 components installed" + else + ra_log "Warning: unable to install Android SDK 36 components (see $SDK_INSTALL_LOG)" + fi + else + ra_log "Warning: sdkmanager not found; cannot install API 36 components" + fi +else + ra_log "Warning: Android SDK root not found; cannot install API 36 components" fi # ---- Prepare app + emulator state ----------------------------------------- @@ -122,13 +141,14 @@ sleep 2 GRADLEW="./gradlew" GRADLE_CMD=("$GRADLEW" --stacktrace --info --no-daemon connectedDebugAndroidTest) +GRADLE_LOG="$ARTIFACTS_DIR/connectedDebugAndroidTest-gradle.log" ra_log "Executing connectedDebugAndroidTest via Gradle" if ! ( cd "scripts/hellocodenameone/android/target/hellocodenameone-android-1.0-SNAPSHOT-android-source" - JAVA_HOME="${JDK_HOME:-$JAVA17_HOME}" "${GRADLE_CMD[@]}" + JAVA_HOME="${JDK_HOME:-$JAVA17_HOME}" "${GRADLE_CMD[@]}" 2>&1 | tee "$GRADLE_LOG" ); then - ra_log "FATAL: connectedDebugAndroidTest failed" + ra_log "FATAL: connectedDebugAndroidTest failed (see $GRADLE_LOG)" exit 10 fi From e2a639e3784b50d61968ca7603d6de0e14e63021 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Wed, 28 Jan 2026 21:02:15 +0200 Subject: [PATCH 08/11] Upload Android Gradle logs from CI --- .github/workflows/scripts-android.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/scripts-android.yml b/.github/workflows/scripts-android.yml index 6247879507..b7649e49c5 100644 --- a/.github/workflows/scripts-android.yml +++ b/.github/workflows/scripts-android.yml @@ -155,6 +155,15 @@ jobs: if-no-files-found: warn retention-days: 14 compression-level: 6 + - name: Upload Android Gradle logs + if: always() && matrix.id == 'default' + uses: actions/upload-artifact@v4 + with: + name: android-gradle-logs + path: artifacts/*gradle*.log + if-no-files-found: warn + retention-days: 14 + compression-level: 6 - name: Upload Android Jacoco coverage report if: always() && matrix.id == 'default' uses: actions/upload-artifact@v4 From ee5a5153af8f8ad093f800a0f13ad488ca07b572 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Thu, 29 Jan 2026 03:49:41 +0200 Subject: [PATCH 09/11] Capture Android test reports and avoid eager classpath resolve --- .github/workflows/scripts-android.yml | 9 +++++++++ scripts/android/lib/PatchGradleFiles.java | 6 ++++-- scripts/build-android-app.sh | 1 + scripts/run-android-instrumentation-tests.sh | 9 +++++++++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/.github/workflows/scripts-android.yml b/.github/workflows/scripts-android.yml index b7649e49c5..cc3dfec3cc 100644 --- a/.github/workflows/scripts-android.yml +++ b/.github/workflows/scripts-android.yml @@ -164,6 +164,15 @@ jobs: if-no-files-found: warn retention-days: 14 compression-level: 6 + - name: Upload Android test report + if: always() && matrix.id == 'default' + uses: actions/upload-artifact@v4 + with: + name: android-test-report + path: artifacts/android-test-report + if-no-files-found: warn + retention-days: 14 + compression-level: 6 - name: Upload Android Jacoco coverage report if: always() && matrix.id == 'default' uses: actions/upload-artifact@v4 diff --git a/scripts/android/lib/PatchGradleFiles.java b/scripts/android/lib/PatchGradleFiles.java index b2204511f8..001dea85ed 100644 --- a/scripts/android/lib/PatchGradleFiles.java +++ b/scripts/android/lib/PatchGradleFiles.java @@ -304,9 +304,11 @@ private static Result ensureJacocoConfiguration(String content) { def kotlinClasses = fileTree(dir: "$buildDir/tmp/kotlin-classes/debug", exclude: excludes) def aarMainJar = file("$buildDir/intermediates/aar_main_jar/debug/classes.jar") def aarTrees = aarMainJar.exists() ? [zipTree(aarMainJar)] : [] - def runtimeJars = configurations.debugRuntimeClasspath.filter { it.name.endsWith('.jar') }.collect { zipTree(it) } + def runtimeJarsProvider = providers.provider { + configurations.debugRuntimeClasspath.filter { it.name.endsWith('.jar') }.collect { zipTree(it) } + } - classDirectories.setFrom(files(javaClasses, kotlinClasses, aarTrees, runtimeJars).asFileTree.matching { + classDirectories.setFrom(files(javaClasses, kotlinClasses, aarTrees, runtimeJarsProvider).asFileTree.matching { include 'com/codename1/impl/android/**' }) diff --git a/scripts/build-android-app.sh b/scripts/build-android-app.sh index 98bef66732..b67bdddc9b 100755 --- a/scripts/build-android-app.sh +++ b/scripts/build-android-app.sh @@ -120,6 +120,7 @@ ba_log "Installed Android instrumentation tests in $ANDROID_TEST_JAVA_DIR" GRADLE_PROPS="$GRADLE_PROJECT_DIR/gradle.properties" grep -q '^android.useAndroidX=' "$GRADLE_PROPS" 2>/dev/null || echo 'android.useAndroidX=true' >> "$GRADLE_PROPS" grep -q '^android.enableJetifier=' "$GRADLE_PROPS" 2>/dev/null || echo 'android.enableJetifier=true' >> "$GRADLE_PROPS" +grep -q '^android.suppressUnsupportedCompileSdk=' "$GRADLE_PROPS" 2>/dev/null || echo 'android.suppressUnsupportedCompileSdk=36' >> "$GRADLE_PROPS" APP_BUILD_GRADLE="$GRADLE_PROJECT_DIR/app/build.gradle" ROOT_BUILD_GRADLE="$GRADLE_PROJECT_DIR/build.gradle" diff --git a/scripts/run-android-instrumentation-tests.sh b/scripts/run-android-instrumentation-tests.sh index aa7bd4d721..fe6c59fa73 100755 --- a/scripts/run-android-instrumentation-tests.sh +++ b/scripts/run-android-instrumentation-tests.sh @@ -142,12 +142,21 @@ sleep 2 GRADLEW="./gradlew" GRADLE_CMD=("$GRADLEW" --stacktrace --info --no-daemon connectedDebugAndroidTest) GRADLE_LOG="$ARTIFACTS_DIR/connectedDebugAndroidTest-gradle.log" +ANDROID_TEST_REPORT_DIR="scripts/hellocodenameone/android/target/hellocodenameone-android-1.0-SNAPSHOT-android-source/app/build/reports/androidTests/connected" +ANDROID_TEST_REPORT_DEST="$ARTIFACTS_DIR/android-test-report" ra_log "Executing connectedDebugAndroidTest via Gradle" if ! ( cd "scripts/hellocodenameone/android/target/hellocodenameone-android-1.0-SNAPSHOT-android-source" JAVA_HOME="${JDK_HOME:-$JAVA17_HOME}" "${GRADLE_CMD[@]}" 2>&1 | tee "$GRADLE_LOG" ); then + if [ -d "$ANDROID_TEST_REPORT_DIR" ]; then + rm -rf "$ANDROID_TEST_REPORT_DEST" + cp -R "$ANDROID_TEST_REPORT_DIR" "$ANDROID_TEST_REPORT_DEST" + ra_log "Saved Android test report to $ANDROID_TEST_REPORT_DEST" + else + ra_log "Android test report directory not found at $ANDROID_TEST_REPORT_DIR" + fi ra_log "FATAL: connectedDebugAndroidTest failed (see $GRADLE_LOG)" exit 10 fi From 4c4c676e4b2f249892bf41a9b95891bea64e0d8b Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Thu, 29 Jan 2026 18:37:38 +0200 Subject: [PATCH 10/11] Ensure all Gradle repositories include mavenCentral --- scripts/android/lib/PatchGradleFiles.java | 47 +++++++++++++---------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/scripts/android/lib/PatchGradleFiles.java b/scripts/android/lib/PatchGradleFiles.java index 001dea85ed..94e77323d9 100644 --- a/scripts/android/lib/PatchGradleFiles.java +++ b/scripts/android/lib/PatchGradleFiles.java @@ -48,6 +48,7 @@ public static void main(String[] args) throws Exception { private static boolean patchRootBuildGradle(Path path) throws IOException { String content = Files.readString(path, StandardCharsets.UTF_8); Matcher matcher = REPOSITORIES_PATTERN.matcher(content); + boolean changed = false; if (!matcher.find()) { if (!content.endsWith("\n")) { content += "\n"; @@ -57,31 +58,37 @@ private static boolean patchRootBuildGradle(Path path) throws IOException { return true; } - String block = matcher.group(); - boolean changed = false; - if (!block.contains("google()") || !block.contains("mavenCentral()")) { - String[] lines = block.split("\n"); - java.util.LinkedHashSet body = new java.util.LinkedHashSet<>(); - for (int i = 1; i < lines.length - 1; i++) { - String line = lines[i].trim(); - if (!line.isEmpty()) { - body.add(" " + line.trim()); + matcher.reset(); + StringBuffer updated = new StringBuffer(); + while (matcher.find()) { + String block = matcher.group(); + if (!block.contains("google()") || !block.contains("mavenCentral()")) { + String[] lines = block.split("\n"); + java.util.LinkedHashSet body = new java.util.LinkedHashSet<>(); + for (int i = 1; i < lines.length - 1; i++) { + String line = lines[i].trim(); + if (!line.isEmpty()) { + body.add(" " + line.trim()); + } } + body.add(" google()"); + body.add(" mavenCentral()"); + StringBuilder newBlock = new StringBuilder(); + newBlock.append(lines[0]).append('\n'); + for (String line : body) { + newBlock.append(line).append('\n'); + } + newBlock.append(lines[lines.length - 1]); + matcher.appendReplacement(updated, Matcher.quoteReplacement(newBlock.toString())); + changed = true; + } else { + matcher.appendReplacement(updated, Matcher.quoteReplacement(block)); } - body.add(" google()"); - body.add(" mavenCentral()"); - StringBuilder newBlock = new StringBuilder(); - newBlock.append(lines[0]).append('\n'); - for (String line : body) { - newBlock.append(line).append('\n'); - } - newBlock.append(lines[lines.length - 1]); - content = content.substring(0, matcher.start()) + newBlock + content.substring(matcher.end()); - changed = true; } + matcher.appendTail(updated); if (changed) { - Files.writeString(path, ensureTrailingNewline(content), StandardCharsets.UTF_8); + Files.writeString(path, ensureTrailingNewline(updated.toString()), StandardCharsets.UTF_8); } return changed; } From 25e57d9dd2dd25c0cbbd94c87b882f1336de302c Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Thu, 29 Jan 2026 19:10:26 +0200 Subject: [PATCH 11/11] Defer Jacoco runtime classpath resolution --- scripts/android/lib/PatchGradleFiles.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/scripts/android/lib/PatchGradleFiles.java b/scripts/android/lib/PatchGradleFiles.java index 94e77323d9..fc562f3905 100644 --- a/scripts/android/lib/PatchGradleFiles.java +++ b/scripts/android/lib/PatchGradleFiles.java @@ -311,11 +311,9 @@ private static Result ensureJacocoConfiguration(String content) { def kotlinClasses = fileTree(dir: "$buildDir/tmp/kotlin-classes/debug", exclude: excludes) def aarMainJar = file("$buildDir/intermediates/aar_main_jar/debug/classes.jar") def aarTrees = aarMainJar.exists() ? [zipTree(aarMainJar)] : [] - def runtimeJarsProvider = providers.provider { - configurations.debugRuntimeClasspath.filter { it.name.endsWith('.jar') }.collect { zipTree(it) } - } + def runtimeJars = project.files({ configurations.debugRuntimeClasspath.filter { it.name.endsWith('.jar') }.collect { zipTree(it) } }) - classDirectories.setFrom(files(javaClasses, kotlinClasses, aarTrees, runtimeJarsProvider).asFileTree.matching { + classDirectories.setFrom(files(javaClasses, kotlinClasses, aarTrees, runtimeJars).asFileTree.matching { include 'com/codename1/impl/android/**' })