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

GitLab CI远程Linux环境Android仪器化测试偶发失败问题排查

问题根因

从报错栈可直接定位核心原因为ADB安装APK时触发超时中断,偶发成功是刚好某次CI runner性能足够,在默认超时阈值内完成了安装,绝大多数场景下CI资源不足无法在时限内完成操作。具体配置问题如下:

  • 你配置的ADB_INSTALL_TIMEOUT=10仅10秒,远低于CI环境下模拟器安装大中型APK的最低要求
  • 选用的armeabi-v7a系统镜像没有启用硬件加速,本身在无GPU的Linux CI runner上运行性能极差,很容易触发无响应
  • 仅用基础的android-wait-for-emulator脚本只检测了模拟器启动完成,没有等待系统核心服务、安装权限完全就绪就直接触发安装操作
  • 没有提前卸载同包名的旧应用,可能存在残留数据拖慢安装流程
  • 没有配置Gradle测试任务的超时阈值,默认的ddmlib超时时间和你配置的ADB超时不匹配

修复步骤

1. 调整超时相关配置

修改variables块下的超时参数,同时增加Gradle测试相关的超时配置:

variables:
  # 原有变量保留,新增/修改以下内容
  ADB_INSTALL_TIMEOUT: 120 # 可根据你的APK大小继续上调
  ADB_TIMEOUT: 120
  GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4g -Dcom.android.ddmlib.timeout=120000"

2. 调整模拟器启动与就绪检测逻辑

修改e2e_test阶段的脚本,补充系统就绪校验、提前卸载旧包的逻辑,优先使用性能更高的x86_64镜像:

e2e_test:
  stage: e2e_test
  only:
    - develop
    - tags
  script:
    - wget --quiet --output-document=android-wait-for-emulator.sh https://raw.githubusercontent.com/travis-ci/travis-cookbooks/0f497eb71291b52a703143c5cd63a217c8766dc9/community-cookbooks/android-sdk/files/default/android-wait-for-emulator
    - chmod +x android-wait-for-emulator.sh
    - echo y | ${ANDROID_SDK_MANAGER} --update > update.log
    - echo y | ${ANDROID_SDK_MANAGER} "platform-tools" "emulator" "system-images;android-${EMULATOR_VERSION};default;x86_64" > installEmulator.log # x86_64镜像性能远高于armeabi-v7a,适配绝大多数x86架构的CI runner
    - echo no | ${ANDROID_AVD_MANAGER} --verbose create avd -n test --force -k "system-images;android-${EMULATOR_VERSION};default;x86_64"
    # 启动模拟器时增加内存分配、禁用动画参数
    - ${ANDROID_EMULATOR_HOME}/emulator -avd test -no-snapshot-save -no-audio -no-window -no-boot-anim -gpu off -memory 2048 -verbose &
    - ./android-wait-for-emulator.sh
    # 额外等待系统服务完全就绪,禁用系统动画避免测试卡顿
    - adb wait-for-device
    - adb shell settings put global window_animation_scale 0
    - adb shell settings put global transition_animation_scale 0
    - adb shell settings put global animator_duration_scale 0
    # 提前卸载旧包避免安装冲突,替换为你自己应用的包名
    - adb uninstall 你的应用包名 || true
    - adb uninstall 你的应用包名.test || true
    - adb shell input keyevent 82
    - ./gradlew connected${ENVIRONMENT^}DebugAndroidTest -Pandroid.testInstallTimeout=120000 -Pandroid.testOptions.timeoutInSec=120 --stacktrace --continue || true
    - adb devices | grep emulator | cut -f1 | while read line; do adb -s $line emu kill; done

3. 可选优化

如果你的CI runner支持KVM,启动任务前开启KVM权限,可以让模拟器性能提升5-10倍,基本不会再出现超时问题。如果确实无法切换x86_64镜像,可将ADB_INSTALL_TIMEOUT上调到180秒以上。

内容的提问来源于stack exchange,提问作者A. Silva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:45:01