You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动