name: Android on: workflow_call: workflow_dispatch: jobs: build-llm-demo: name: build-llm-demo uses: pytorch/test-infra/.github/workflows/linux_job_v2.yml@main permissions: id-token: write contents: read with: runner: linux.2xlarge docker-image: executorch-ubuntu-22.04-clang12-android submodules: 'recursive' ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }} timeout: 90 upload-artifact: android-apps upload-artifact-to-s3: true script: | set -eux # Use sccache for NDK compiler as well export CMAKE_CXX_COMPILER_LAUNCHER=sccache export CMAKE_C_COMPILER_LAUNCHER=sccache # The generic Linux job chooses to use base env, not the one setup by the image CONDA_ENV=$(conda env list --json | jq -r ".envs | .[-1]") conda activate "${CONDA_ENV}" PYTHON_EXECUTABLE=python bash .ci/scripts/setup-linux.sh --build-tool buck2 export ARTIFACTS_DIR_NAME=artifacts-to-be-uploaded mkdir -p ${ARTIFACTS_DIR_NAME}/ # Build LLM Demo for Android export BUILD_AAR_DIR=aar-out mkdir -p $BUILD_AAR_DIR bash scripts/build_android_library.sh cp ${BUILD_AAR_DIR}/executorch.aar $ARTIFACTS_DIR_NAME mkdir -p ${ARTIFACTS_DIR_NAME}/library_test_dir bash extension/android/executorch_android/android_test_setup.sh (cd extension/android; ANDROID_HOME="${ANDROID_SDK:-/opt/android/sdk}" ./gradlew :executorch_android:assembleAndroidTest) cp extension/android/executorch_android/build/outputs/apk/androidTest/debug/executorch_android-debug-androidTest.apk "${ARTIFACTS_DIR_NAME}/library_test_dir" mkdir -p ${ARTIFACTS_DIR_NAME}/fp32-xnnpack-custom bash examples/models/llama/install_requirements.sh bash ".ci/scripts/test_llama.sh" -model stories110M -build_tool cmake -dtype fp16 -mode portable -upload ${ARTIFACTS_DIR_NAME}/fp32-xnnpack-custom mkdir -p examples/demo-apps/android/LlamaDemo/app/libs cp aar-out/executorch.aar examples/demo-apps/android/LlamaDemo/app/libs pushd examples/demo-apps/android/LlamaDemo ANDROID_HOME="${ANDROID_SDK:-/opt/android/sdk}" ./gradlew build assembleAndroidTest popd DEMO_APP_DIR="${ARTIFACTS_DIR_NAME}/llm_demo" # The app directory is named using its build flavor as a suffix. mkdir -p "${DEMO_APP_DIR}" # Collect the app and its test suite cp examples/demo-apps/android/LlamaDemo/app/build/outputs/apk/debug/*.apk "${DEMO_APP_DIR}" cp examples/demo-apps/android/LlamaDemo/app/build/outputs/apk/androidTest/debug/*.apk "${DEMO_APP_DIR}" # Running Android emulator directly on the runner and not using Docker run-emulator: needs: build-llm-demo # NB: Use metal install for KVM support to run the emulator faster runs-on: linux.24xl.spr-metal env: ANDROID_NDK_VERSION: r27b API_LEVEL: 34 steps: - name: Setup SSH (Click me for login details) uses: pytorch/test-infra/.github/actions/setup-ssh@main with: github-secret: ${{ secrets.GITHUB_TOKEN }} instructions: | This is used to run Android emulators, ANDROID_HOME is installed at /opt/android/sdk - uses: actions/checkout@v3 with: submodules: false - name: Setup conda uses: pytorch/test-infra/.github/actions/setup-miniconda@main with: python-version: '3.10' - name: Install Android dependencies shell: bash run: | set -eux # Reuse the script that install Android on ET Docker image sudo -E bash .ci/docker/common/install_android.sh # After https://github.com/ReactiveCircus/android-emulator-runner/releases/tag/v2.33.0 release, # it seems that we need to chown the Android setup to the current user instead of root to # avoid permission issue sudo chown -R "${USER}" /opt/android - name: Download Artifacts shell: bash run: | set -eux curl -O https://gha-artifacts.s3.amazonaws.com/${{ github.repository }}/${{ github.run_id }}/artifacts/llm_demo/app-debug.apk curl -O https://gha-artifacts.s3.amazonaws.com/${{ github.repository }}/${{ github.run_id }}/artifacts/llm_demo/app-debug-androidTest.apk curl -O https://gha-artifacts.s3.amazonaws.com/${{ github.repository }}/${{ github.run_id }}/artifacts/fp32-xnnpack-custom/model.zip curl -o android-test-debug-androidTest.apk https://gha-artifacts.s3.amazonaws.com/${{ github.repository }}/${{ github.run_id }}/artifacts/library_test_dir/executorch_android-debug-androidTest.apk unzip model.zip mv *.pte model.pte - name: Gradle cache uses: gradle/actions/setup-gradle@v3 - name: AVD cache uses: actions/cache@v4 id: avd-cache with: path: | ~/.android/avd/* ~/.android/adb* key: avd-${{ env.API_LEVEL }} # NB: It takes about 10m to cold boot the emulator here - name: Run Android emulator env: ANDROID_HOME: /opt/android/sdk uses: reactivecircus/android-emulator-runner@v2 with: api-level: ${{ env.API_LEVEL }} arch: x86_64 script: ./scripts/run_android_emulator.sh # NB: This is to boot the emulator faster following the instructions on # https://github.com/ReactiveCircus/android-emulator-runner. The max number # of cores we can set is 6, any higher number will be reduced to 6. cores: 6 ram-size: 16384M heap-size: 12288M force-avd-creation: false disable-animations: true emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none # This is to make sure that the job doesn't fail flakily emulator-boot-timeout: 900