Add Android sample test and emulator screenshot workflow #213
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| --- | |
| name: Test Android build scripts | |
| 'on': | |
| pull_request: | |
| paths: | |
| - 'scripts/**' | |
| - 'BUILDING.md' | |
| push: | |
| branches: | |
| - master | |
| paths-ignore: | |
| - '**/*.md' | |
| jobs: | |
| build-android: | |
| runs-on: ubuntu-latest | |
| outputs: | |
| artifact_dir: ${{ steps.build-app.outputs.artifact_dir }} | |
| app_apk: ${{ steps.build-app.outputs.app_apk }} | |
| test_apk: ${{ steps.build-app.outputs.test_apk }} | |
| package_name: ${{ steps.build-app.outputs.package_name }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Setup workspace | |
| run: ./scripts/setup-workspace.sh -q -DskipTests | |
| - name: Build Android port | |
| run: ./scripts/build-android-port.sh -q -DskipTests | |
| - name: Build Hello Codename One Android app | |
| id: build-app | |
| run: ./scripts/build-android-app.sh -q -DskipTests | |
| - name: Upload Android APK artifacts | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: hello-codenameone-apks | |
| path: ${{ steps.build-app.outputs.artifact_dir }} | |
| if-no-files-found: error | |
| android-device-tests: | |
| needs: build-android | |
| runs-on: ubuntu-22.04-arm | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Set up JDK 17 | |
| uses: actions/setup-java@v4 | |
| with: | |
| distribution: temurin | |
| java-version: '17' | |
| - name: Install Android SDK | |
| uses: android-actions/setup-android@v3 | |
| with: | |
| accept-android-sdk-licenses: false | |
| packages: '' | |
| - name: Ensure Android tools available on PATH | |
| shell: bash | |
| run: | | |
| set -euxo pipefail | |
| if ! command -v sdkmanager >/dev/null 2>&1; then | |
| echo "sdkmanager executable is required" >&2 | |
| exit 1 | |
| fi | |
| SDKMANAGER="$(command -v sdkmanager)" | |
| run_sdk() { | |
| set +o pipefail | |
| yes | "$SDKMANAGER" "$@" >/dev/null 2>&1 | |
| local rc=${PIPESTATUS[1]} | |
| set -o pipefail | |
| return $rc | |
| } | |
| run_sdk --licenses | |
| run_sdk --install "platform-tools" "build-tools;34.0.0" | |
| run_sdk --install "platforms;android-33" || echo "Warning: failed to install Android 33 platform" >&2 | |
| if [ -n "${ANDROID_HOME:-}" ] && [ -d "${ANDROID_HOME}/platform-tools" ]; then | |
| echo "${ANDROID_HOME}/platform-tools" >> "$GITHUB_PATH" | |
| fi | |
| if [ -n "${ANDROID_SDK_ROOT:-}" ] && [ -d "${ANDROID_SDK_ROOT}/platform-tools" ]; then | |
| echo "${ANDROID_SDK_ROOT}/platform-tools" >> "$GITHUB_PATH" | |
| fi | |
| command -v adb | |
| adb version | |
| - name: Download APK artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: hello-codenameone-apks | |
| path: artifacts | |
| - name: Launch emulator and capture screenshots | |
| uses: reactivecircus/android-emulator-runner@v2 | |
| with: | |
| api-level: 33 | |
| arch: arm64-v8a | |
| profile: pixel_6 | |
| pre-emulator-launch-script: | | |
| set -euxo pipefail | |
| adb version | |
| script: | | |
| set -euxo pipefail | |
| mkdir -p screenshots | |
| adb install -r "artifacts/${{ needs.build-android.outputs.app_apk }}" | |
| adb install -r -t "artifacts/${{ needs.build-android.outputs.test_apk }}" | |
| adb logcat -c | |
| AAPT_BIN="" | |
| if command -v aapt >/dev/null 2>&1; then | |
| AAPT_BIN="$(command -v aapt)" | |
| elif [ -n "${ANDROID_HOME:-}" ] && [ -d "${ANDROID_HOME}/build-tools" ]; then | |
| AAPT_BIN="$(find "${ANDROID_HOME}/build-tools" -maxdepth 2 -name aapt -type f | sort | tail -n1 || true)" | |
| elif [ -n "${ANDROID_SDK_ROOT:-}" ] && [ -d "${ANDROID_SDK_ROOT}/build-tools" ]; then | |
| AAPT_BIN="$(find "${ANDROID_SDK_ROOT}/build-tools" -maxdepth 2 -name aapt -type f | sort | tail -n1 || true)" | |
| fi | |
| TEST_PACKAGE="" | |
| INSTRUMENTATION_NAME="" | |
| if [ -n "$AAPT_BIN" ] && [ -x "$AAPT_BIN" ]; then | |
| BADGING_OUTPUT="$($AAPT_BIN dump badging artifacts/${{ needs.build-android.outputs.test_apk }} || true)" | |
| if [ -n "$BADGING_OUTPUT" ]; then | |
| TEST_PACKAGE="$(printf '%s\n' "$BADGING_OUTPUT" | awk -F"'" '/^package: /{print $2; exit}')" | |
| INSTRUMENTATION_NAME="$(printf '%s\n' "$BADGING_OUTPUT" | awk -F"'" '/^instrumentation: /{print $2; exit}')" | |
| fi | |
| fi | |
| if [ -n "$INSTRUMENTATION_NAME" ]; then | |
| echo "Running instrumentation tests via $INSTRUMENTATION_NAME" | |
| adb shell am instrument -w "$INSTRUMENTATION_NAME" | |
| else | |
| if [ -z "$TEST_PACKAGE" ]; then | |
| TEST_PACKAGE="${{ needs.build-android.outputs.package_name }}.tests" | |
| fi | |
| echo "Instrumentation runner not found, launching $TEST_PACKAGE via monkey" | |
| adb shell monkey -p "$TEST_PACKAGE" 1 | |
| fi | |
| adb shell monkey -p "${{ needs.build-android.outputs.package_name }}" 1 || true | |
| sleep 20 | |
| if [ -f artifacts/tests.txt ]; then | |
| while IFS= read -r testName; do | |
| [ -n "$testName" ] || continue | |
| adb exec-out screencap -p > "screenshots/${testName}.png" | |
| done < artifacts/tests.txt | |
| else | |
| adb exec-out screencap -p > screenshots/test-suite.png | |
| fi | |
| - name: Upload emulator screenshots | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: hello-codenameone-test-screenshots | |
| path: screenshots | |
| if-no-files-found: error |