如何在GitLab CI中运行带Google Play的AVD?创建AVD遇错求助
解决GitLab CI中AVD创建失败的Espresso测试问题
问题背景
我在GitLab CI中配置了Android项目的CI脚本,目标是运行Espresso测试,但在安装并创建AVD时遇到了失败。
我的GitLab CI脚本
image: eclipse-temurin:17-jdk-jammy variables: # 需与项目中的compileSdkVersion匹配 ANDROID_COMPILE_SDK: "29" # 需与项目中的buildToolsVersion匹配 ANDROID_BUILD_TOOLS: "29.0.3" # 从Android Studio官网CLI Tools Only区域获取版本号 ANDROID_SDK_TOOLS: "6514223" before_script: - apt-get --quiet update --yes - apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1 # 配置Android Home目录 - export ANDROID_HOME="${PWD}/android-home" - install -d $ANDROID_HOME # 下载并解压Android SDK工具 - wget --output-document=$ANDROID_HOME/cmdline-tools.zip https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_SDK_TOOLS}_latest.zip - pushd $ANDROID_HOME - unzip -d cmdline-tools cmdline-tools.zip - popd - export PATH=$PATH:${ANDROID_HOME}/cmdline-tools/tools/bin/ # 配置Gradle缓存目录 - export GRADLE_USER_HOME=${PWD}/.gradle # 初始化Android SDK - sdkmanager --version - yes | sdkmanager --sdk_root=${ANDROID_HOME} --licenses || true - sdkmanager --sdk_root=${ANDROID_HOME} "platforms;android-${ANDROID_COMPILE_SDK}" - sdkmanager --sdk_root=${ANDROID_HOME} "platform-tools" - sdkmanager --sdk_root=${ANDROID_HOME} "build-tools;${ANDROID_BUILD_TOOLS}" - chmod +x ./gradlew cache: key: ${CI_PROJECT_ID} paths: - .gradle/ stages: - build - test - deploy UI-Tests: stage: test allow_failure: true script: # 安装AVD相关组件 - sdkmanager --list | grep system-images - sdkmanager --sdk_root=${ANDROID_HOME} --install "system-images;android-29;default;arm64-v8a" - echo y | sdkmanager "emulator" >/dev/null - echo y | sdkmanager "system-images;android-${ANDROID_COMPILE_SDK};google_apis_playstore;x86" - echo y | avdmanager create avd -f -n testAVD -k "system-images;android-${ANDROID_COMPILE_SDK};google_apis_playstore;x86" - android-sdk-linux/emulator/emulator -avd testAVD -no-audio -no-window & artifacts: paths: - app/build/reports/androidTests - app/build/outputs/androidTest-results
遇到的错误信息
$ sdkmanager --sdk_root=${ANDROID_HOME} --install "system-images;android-29;default;arm64-v8a" [=======================================] 100% Unzipping... arm64-v8a/data/misc/ $ echo y | sdkmanager "emulator" >/dev/null $ echo y | sdkmanager "system-images;android-${ANDROID_COMPILE_SDK};google_apis_playstore;x86" [=======================================] 100% Unzipping... x86/VerifiedBootPara $ echo y | avdmanager create avd -f -n testAVD -k "system-images;android-${ANDROID_COMPILE_SDK};google_apis_playstore;x86" Auto-selecting single ABI x86 Do you wish to create a custom hardware profile? [no] 0: PlayStore: Does the device supports Google Play? PlayStore.enabled [no]:offset 0, count -1, length 256 Cleaning up project directory and file based variables 00:01 ERROR: Job failed: exit code 1
我知道手动运行时需要在config.ini里启用Google Play,但不确定CI环境下这是不是最优方案,也怀疑是不是选错了AVD镜像。
解决方案
1. 更换AVD镜像,避免交互提问
如果测试不需要Google Play服务,直接选择不带Play Store的镜像(比如google_apis而非google_apis_playstore),这样就不会触发PlayStore.enabled的交互提示,适合CI无人工干预的场景。修改UI-Tests阶段的脚本:
- echo y | sdkmanager "system-images;android-${ANDROID_COMPILE_SDK};google_apis;x86" - echo y | avdmanager create avd -f -n testAVD -k "system-images;android-${ANDROID_COMPILE_SDK};google_apis;x86"
2. 强制跳过交互,指定PlayStore参数
如果必须使用带Google Play的镜像,可以通过输入流直接回答交互问题,或者事后修改配置文件:
- 直接通过输入流跳过:
- echo -e "no\n" | avdmanager create avd -f -n testAVD -k "system-images;android-${ANDROID_COMPILE_SDK};google_apis_playstore;x86"
- 手动修改AVD配置文件启用Play Store:
- avdmanager create avd -f -n testAVD -k "system-images;android-${ANDROID_COMPILE_SDK};google_apis_playstore;x86" --device "pixel" - echo "PlayStore.enabled=true" >> ~/.android/avd/testAVD.avd/config.ini
3. 修复模拟器启动路径错误
原脚本中启动模拟器的路径android-sdk-linux/emulator/emulator是错误的,应该使用${ANDROID_HOME}变量指定正确路径:
- ${ANDROID_HOME}/emulator/emulator -avd testAVD -no-audio -no-window -no-boot-anim &
4. 添加模拟器就绪等待逻辑
Espresso测试需要等待模拟器完全启动才能正常运行,添加以下命令确保模拟器就绪:
- adb wait-for-device - adb shell input keyevent 82 &
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

