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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:30:07