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
相关产品推荐
相关产品推荐

