You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:43:15