name: Android CI on: push: branches: [main] pull_request: workflow_dispatch: permissions: contents: read concurrency: group: android-${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: verify: name: Build, test, and verify runs-on: ubuntu-latest timeout-minutes: 45 steps: - name: Check out source uses: actions/checkout@v7 - name: Set up JDK 21 uses: actions/setup-java@v6 with: distribution: temurin java-version: '21' cache: gradle - name: Set up Python uses: actions/setup-python@v7 with: python-version: '3.12' cache: pip cache-dependency-path: tools/requirements.txt - name: Set up Node.js uses: actions/setup-node@v7 with: node-version: '22' cache: npm - name: Install Android SDK components run: | SDKMANAGER="$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" yes | "$SDKMANAGER" --licenses >/dev/null || true "$SDKMANAGER" \ 'platforms;android-35' \ 'build-tools;35.0.0' \ 'ndk;29.0.14206865' - name: Install controller and agent dependencies run: | python -m pip install --requirement tools/requirements.txt npm ci - name: Verify reproducible Frida agents run: | python tools/build_frida_agents.py git diff --exit-code -- scripts/dist - name: Build and test run: | chmod +x gradlew ./gradlew \ :app:assembleDebug \ :app:assembleRelease \ :Bcore:testDebugUnitTest \ :app:testDebugUnitTest \ :app:check \ --stacktrace \ --console=plain - name: Upload APKs and reports if: always() uses: actions/upload-artifact@v7 with: name: fridabox-${{ github.sha }} if-no-files-found: warn retention-days: 14 path: | app/build/outputs/apk/**/*.apk app/build/reports/lint-results-*.html app/build/test-results/**/*.xml Bcore/build/test-results/**/*.xml