name: CI on: [push, pull_request] jobs: build: name: Build & test runs-on: ubuntu-latest container: image: httptoolkit/act-build-base:v3.0.0 steps: - uses: actions/checkout@v7 - name: Build a single-file Android script run: | mkdir -p ./build/ paste -sd'\n' ./config.js \ ./native-connect-hook.js \ ./native-tls-hook.js \ ./android/android-proxy-override.js \ ./android/android-system-certificate-injection.js \ ./android/android-certificate-unpinning.js \ ./android/android-certificate-unpinning-fallback.js \ ./android/android-disable-root-detection.js \ > ./build/android-frida-interception-script.js - uses: actions/upload-artifact@v7 with: name: android-frida-interception-script.js path: ./build/android-frida-interception-script.js if-no-files-found: error - name: Publish the combined script to GitHub Releases uses: svenstaro/upload-release-action@v2 if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') with: body: | The pre-combined scripts for the ${{ github.ref_name }} release. This contains the same content as the repo, but pre-combined into a single script for convenient usage. This script still requires configuration: you'll need to provide the `CERT_PEM` and typically `PROXY_HOST` and `PROXY_PORT` variables in the first section of the file. asset_name: android-frida-interception-script-${{ github.ref }}.js file: ./build/android-frida-interception-script.js tag: ${{ github.ref }} repo_token: ${{ secrets.GITHUB_TOKEN }} test-android: name: Test on Android emulator runs-on: ubuntu-latest strategy: fail-fast: false matrix: api-level: [26, 28, 30, 33, 35] steps: - uses: actions/checkout@v7 - name: Set up Python uses: actions/setup-python@v7 with: python-version: '3.11' - name: Set up Node.js uses: actions/setup-node@v7 with: node-version: '24' cache: 'npm' cache-dependency-path: 'test/android/package-lock.json' - name: Install Frida CLI run: | pip install --user frida-tools==14.10.4 echo "$HOME/.local/bin" >> $GITHUB_PATH # Apparently significantly improves emulator performance: - name: Enable KVM run: | echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules sudo udevadm control --reload-rules sudo udevadm trigger --name-match=kvm # Cache the emulator AVD: - name: AVD cache uses: actions/cache@v6 id: avd-cache with: path: | ~/.android/avd/* ~/.android/adb* key: avd-${{ matrix.api-level }} - name: Create AVD and cache snapshot if: steps.avd-cache.outputs.cache-hit != 'true' uses: reactivecircus/android-emulator-runner@v2 with: api-level: ${{ matrix.api-level }} target: google_apis profile: pixel_c arch: x86_64 ram-size: 2048M heap-size: 512M disk-size: 4096M force-avd-creation: false emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none script: | echo "Generated AVD snapshot for caching." - name: Run tests uses: reactivecircus/android-emulator-runner@v2 with: api-level: ${{ matrix.api-level }} target: google_apis profile: pixel_c arch: x86_64 ram-size: 2048M heap-size: 512M disk-size: 4096M force-avd-creation: false emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none script: | adb devices ./test/android/setup-emulator.sh echo "Emulator ready to test" cd test/android && npm install && npm test -- --retries 3 echo "Tests completed."