Gitlab CI中Android UI测试执行失败求助
排查GitLab CI中Android UI测试失败的问题
我来帮你一步步梳理这个问题,从你给出的脚本来看,有几个常见的坑点可能导致测试跑不起来,咱们逐个解决:
1. 环境变量与SDK路径配置缺失
你的脚本直接用了android-sdk-linux/tools/bin/sdkmanager,但GitLab CI的runner里可能没设置ANDROID_HOME环境变量,也没把SDK的工具目录加到系统PATH里,这会导致后续命令找不到执行文件。
修复方法:在脚本开头添加环境变量配置:
export ANDROID_HOME=$PWD/android-sdk-linux export PATH=$ANDROID_HOME/tools:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools:$PATH
2. 模拟器启动参数优化
你用了-no-accel会让模拟器完全依赖软件模拟,启动速度极慢甚至卡死。如果你的GitLab CI runner支持KVM硬件加速(比如用带有KVM权限的Docker runner),可以去掉-no-accel;如果确实无法用硬件加速,也要给模拟器分配足够内存,避免OOM。
另外,-no-snapshot是对的,但可以再加-memory 2048保证内存充足:
android-sdk-linux/tools/emulator -verbose -avd test -no-window -no-audio -gpu swiftshader_indirect -memory 2048 &
3. 更可靠的模拟器就绪等待逻辑
你用的android-wait-for-emulator脚本有时候不够可靠,建议在它之后再加一段等待系统完全启动的命令:
./android-wait-for-emulator adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;' adb shell input keyevent 82 # 解锁模拟器
4. AVD创建时指定设备类型
创建AVD时如果不指定设备,可能会用默认的老旧设备模板,导致兼容性问题。可以添加-d pixel指定Pixel设备:
echo no | android-sdk-linux/tools/bin/avdmanager create avd -n test -k "system-images;android-${ANDROID_COMPILE_SDK};google_apis_playstore;x86" -d pixel
5. 测试前的额外准备
跑测试前可以关闭系统动画,避免测试超时或不稳定:
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
修复后的完整脚本
把这些调整整合后,你的脚本应该像这样:
# 下载等待模拟器的脚本 wget --quiet --output-document=android-wait-for-emulator 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 # 配置Android环境变量 export ANDROID_HOME=$PWD/android-sdk-linux export PATH=$ANDROID_HOME/tools:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools:$PATH # 安装模拟器和系统镜像 android-sdk-linux/tools/bin/sdkmanager "emulator" "system-images;android-${ANDROID_COMPILE_SDK};google_apis_playstore;x86" # 创建AVD echo no | android-sdk-linux/tools/bin/avdmanager create avd -n test -k "system-images;android-${ANDROID_COMPILE_SDK};google_apis_playstore;x86" -d pixel # 启动模拟器 android-sdk-linux/tools/emulator -verbose -avd test -no-window -no-audio -gpu swiftshader_indirect -memory 2048 & # 等待模拟器完全就绪 ./android-wait-for-emulator adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;' adb shell input keyevent 82 # 关闭系统动画 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 # 运行UI测试 ./gradlew connectedAndroidTest
额外的GitLab CI配置建议
- 如果用Docker runner,选择支持Android SDK的镜像(比如官方
android:latest),并且确保runner开启了KVM权限(需要在宿主机启用KVM,并在runner配置中添加privileged: true)。 - 配置缓存,把SDK和AVD目录缓存起来,避免每次构建都重新下载:
cache: paths: - android-sdk-linux/ - .gradle/ - ~/.android/avd/
内容的提问来源于stack exchange,提问作者M. Tersigni




