如何在GitHub Action的Apple Silicon M1运行器上执行arm64 Android Espresso测试?
在GitHub Action中优化Apple Silicon M1运行器上的Arm64 Android Espresso测试
1. 选择Apple Silicon专属运行器
GitHub Actions提供macos-13或macos-14运行器,基于Apple Silicon(M1/M2)架构,原生支持Arm64模拟器,避免x86转译的性能损耗。在Workflow中指定:
runs-on: macos-14
2. 配置Arm64兼容的Android SDK组件
必须安装Arm64架构的系统镜像和对应SDK组件,否则模拟器无法在M1上高效运行:
yes | sdkmanager --install "platforms;android-34" "system-images;android-34;google_apis;arm64-v8a" "emulator" "platform-tools" "build-tools;34.0.0" sdkmanager --licenses
优先选择Android 33+的系统镜像,新版本对Arm64的优化更完善。
3. 优化模拟器性能参数
模拟器是Espresso测试的核心性能瓶颈,通过调整配置大幅提速:
- 创建Arm64 AVD并强制覆盖旧配置:
avdmanager create avd -n TestEmulator -k "system-images;android-34;google_apis;arm64-v8a" --force - 修改AVD配置文件,分配合理资源并启用硬件加速:
echo "hw.cpu.ncore=4" >> ~/.android/avd/TestEmulator.avd/config.ini echo "hw.ramSize=2048" >> ~/.android/avd/TestEmulator.avd/config.ini echo "hw.gpu.mode=auto" >> ~/.android/avd/TestEmulator.avd/config.ini echo "disk.dataPartition.size=4096M" >> ~/.android/avd/TestEmulator.avd/config.ini
4. 无头模式启动模拟器并等待就绪
用无头模式启动模拟器,禁用不必要的UI和音频功能,减少资源占用:
emulator -avd TestEmulator -no-window -noaudio -no-boot-anim -accel on & # 等待模拟器完全启动并解锁屏幕 adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done' adb shell input keyevent 82
-accel on必须开启,M1运行器原生支持硬件加速,这是提升模拟器性能的关键。
5. 并行执行测试与Gradle优化
- 用Gradle的
--parallel参数并行构建和执行测试,充分利用M1的多核心:./gradlew connectedCheck --parallel - 拆分测试套件:如果测试用例较多,通过GitHub矩阵策略按模块或测试类拆分,并行执行不同批次的测试,进一步缩短总耗时。
6. 缓存关键资源
缓存Android SDK组件、AVD镜像和Gradle依赖,避免每次Workflow重复下载:
- name: Cache emulator image uses: actions/cache@v3 with: path: ~/.android/avd key: avd-arm64-v8a-34-${{ hashFiles('**/build.gradle') }} restore-keys: | avd-arm64-v8a-34- - name: Set up JDK 17 uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' cache: gradle
完整Workflow示例
name: Arm64 Espresso Tests (M1) on: [push, pull_request] jobs: run-espresso: runs-on: macos-14 steps: - uses: actions/checkout@v4 - name: Set up JDK 17 uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' cache: gradle - name: Install Arm64 Android components run: | yes | sdkmanager --install "platforms;android-34" "system-images;android-34;google_apis;arm64-v8a" "emulator" "platform-tools" "build-tools;34.0.0" sdkmanager --licenses - name: Cache AVD and SDK uses: actions/cache@v3 with: path: | ~/.android/avd ~/.android/cache key: avd-arm64-34-${{ hashFiles('**/build.gradle') }} restore-keys: avd-arm64-34- - name: Configure Arm64 AVD run: | export AVD_NAME="M1TestEmulator" echo "no" | avdmanager create avd -n $AVD_NAME -k "system-images;android-34;google_apis;arm64-v8a" --force echo "hw.cpu.ncore=4" >> ~/.android/avd/${AVD_NAME}.avd/config.ini echo "hw.ramSize=2048" >> ~/.android/avd/${AVD_NAME}.avd/config.ini echo "hw.gpu.mode=auto" >> ~/.android/avd/${AVD_NAME}.avd/config.ini - name: Start emulator run: | export AVD_NAME="M1TestEmulator" emulator -avd $AVD_NAME -no-window -noaudio -no-boot-anim -accel on & adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done' adb shell input keyevent 82 - name: Run parallel Espresso tests run: ./gradlew connectedCheck --parallel --no-watch-fs
额外注意事项
- 升级Android Gradle Plugin(AGP)到8.0+,新版本对Arm64和Apple Silicon的兼容性更好。
- 避免在测试中使用硬编码等待逻辑,改用Espresso原生的
IdlingResource处理异步操作。 - 如果测试仍较慢,可尝试降低模拟器分辨率(在config.ini中添加
hw.lcd.density=240),减少渲染负载。
内容的提问来源于stack exchange,提问作者hannes ach
相关产品推荐
相关产品推荐

