Android Things项目Gitlab CI配置问题:模拟器无法被识别
解决GitLab CI中Android模拟器无法被等待脚本识别的问题
我太懂这种糟心的情况了——明明看着模拟器启动了,但CI脚本就是卡在等待环节过不去,这在无图形化的CI环境里真的很常见,主要是旧的等待脚本逻辑跟不上新版本Android工具,加上模拟器在无头环境下的启动状态和本地不一样。结合你的配置,给你几个针对性的解决办法:
1. 替换为更可靠的模拟器等待脚本
你当前用的Travis旧版等待脚本,检测逻辑对新版本模拟器的兼容性不好。直接创建一个新的android-wait-for-emulator脚本,内容如下:
#!/bin/bash set +e boot_completed="" fail_counter=0 timeout=300 until [[ "${boot_completed}" =~ "1" ]]; do boot_completed=$(adb -e shell getprop sys.boot_completed 2>&1) if [[ "${boot_completed}" =~ "device offline" ]]; then echo "Emulator is offline, retrying..." fail_counter=$((fail_counter + 1)) if [[ ${fail_counter} -gt ${timeout}/10 ]]; then echo "Timeout: Emulator failed to come online within ${timeout} seconds" exit 1 fi fi sleep 10 done echo "Emulator has finished booting, ready for tests"
然后执行chmod +x android-wait-for-emulator赋予执行权限,这个脚本直接检测系统启动完成的核心属性,比原来的adb get-state检测更准确。
2. 调整模拟器启动参数优化启动状态
你的启动参数里有些设置可能导致模拟器卡在非就绪状态,修改成以下参数:
android-sdk-linux/tools/emulator -verbose -avd test -no-window -no-audio -gpu swiftshader_indirect -no-snapshot -no-snapshot-save -wipe-data &
- 去掉了
-no-accel:swiftshader_indirect已经是软件渲染模式,-no-accel可能干扰启动流程 - 增加
-no-snapshot-save和-wipe-data:确保每次启动都是干净的全新状态,避免快照残留问题 - 保留
-no-window和-no-audio适配CI无头环境
3. 增加adb连接的容错处理
有时候模拟器进程启动了,但adb还没建立有效连接,在等待脚本前加上这几步:
# 给模拟器足够的启动时间 sleep 15 # 重启adb服务确保连接正常 adb kill-server adb start-server # 确认adb能识别到模拟器 adb devices
4. 检查SDK工具与系统镜像的兼容性
你当前使用的SDK Tools版本(27.0.1)和Android 27系统镜像可能存在适配问题。建议升级到更稳定的新版Command Line Tools:
- 替换原有的SDK Tools下载步骤,改为下载最新的Android Command Line Tools
- 解压后将其放置到
android-sdk-linux/cmdline-tools/latest目录下 - 后续的
sdkmanager命令路径改为android-sdk-linux/cmdline-tools/latest/bin/sdkmanager
5. 优化测试前的确认步骤
在等待脚本执行完成后,先确认模拟器状态再执行解锁和测试:
./android-wait-for-emulator # 确认模拟器状态正常 adb get-state # 执行解锁操作 adb shell input keyevent 82 # 等待解锁完成 sleep 5 # 启动测试 ./gradlew connectedAndroidTest
你可以先试试前两个方案——替换等待脚本和调整启动参数,这两个是解决这类问题最有效的办法。如果还是不行,再逐步排查SDK版本和adb连接的问题。
内容的提问来源于stack exchange,提问作者SoliDev1
相关产品推荐
相关产品推荐

