微软托管MacOS-12代理中特定i7 CPU下Android模拟器无法启动求助
Azure托管MacOS-12代理上Android模拟器启动失败的解决方案
问题背景
在Azure托管的MacOS-12代理上执行UI测试时,使用以下bash脚本启动Android模拟器:
echo "Agent Specifications:" echo "---------------------" sysctl -n machdep.cpu.brand_string sysctl -n hw.memsize sysctl -n hw.ncpu echo "---------------------" echo "Creating emulator" echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-30;google_apis;x86' echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-30;google_apis;x86' --force $ANDROID_HOME/emulator/emulator -list-avds echo "Starting emulator" nohup $ANDROID_HOME/emulator/emulator -avd android_emulator -wipe-data -memory 8192 -skin 1080x1920 -no-snapshot -no-audio -no-boot-anim -accel auto -gpu auto -qemu -lcd-density 420 & echo "<>checking if emulator has started<>" $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '' '') ]]; do sleep 1; done; input keyevent 82' $ANDROID_HOME/platform-tools/adb devices echo "Emulator started"
近期发现半数以上模拟器无法启动,排查日志无差异后添加硬件信息打印,发现代理随机分配两种CPU:
- Intel(R) Xeon(R) CPU E5-1650 v2 @ 3.50GHz(模拟器可正常启动)
- Intel(R) Core(TM) i7-8700B CPU @ 3.20GHz(模拟器无法启动)
已尝试更换OS镜像但无效,且无法在Azure中指定托管代理的CPU,需解决该问题。
可行解决方案
1. 调整模拟器加速与GPU参数
针对i7-8700B CPU,硬件加速可能存在兼容性问题,尝试强制禁用硬件加速并切换到软件GPU渲染:
修改模拟器启动命令为:
nohup $ANDROID_HOME/emulator/emulator -avd android_emulator -wipe-data -memory 8192 -skin 1080x1920 -no-snapshot -no-audio -no-boot-anim -accel off -gpu swiftshader_indirect -qemu -lcd-density 420 &
2. 降低模拟器内存分配
当前设置的-memory 8192占用过高,i7-8700B所在代理可能内存资源受限,将内存调整为4096:
nohup $ANDROID_HOME/emulator/emulator -avd android_emulator -wipe-data -memory 4096 -skin 1080x1920 -no-snapshot -no-audio -no-boot-anim -accel auto -gpu auto -qemu -lcd-density 420 &
3. 切换到ARM架构系统镜像
x86镜像与部分Intel CPU在MacOS环境下存在兼容性问题,改用ARM64架构的Android镜像:
更新sdk安装和AVD创建命令:
echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-30;google_apis;arm64-v8a' echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-30;google_apis;arm64-v8a' --force
启动时移除-qemu参数:
nohup $ANDROID_HOME/emulator/emulator -avd android_emulator -wipe-data -memory 8192 -skin 1080x1920 -no-snapshot -no-audio -no-boot-anim -accel auto -gpu auto -lcd-density 420 &
4. 动态适配CPU型号的启动参数
在脚本中添加CPU检测逻辑,针对不同CPU自动调整启动参数:
echo "Agent Specifications:" echo "---------------------" CPU_MODEL=$(sysctl -n machdep.cpu.brand_string) echo "$CPU_MODEL" sysctl -n hw.memsize sysctl -n hw.ncpu echo "---------------------" # 根据CPU型号设置启动参数 if [[ "$CPU_MODEL" == *"i7-8700B"* ]]; then EMULATOR_OPTS="-accel off -gpu swiftshader_indirect -memory 4096" else EMULATOR_OPTS="-accel auto -gpu auto -memory 8192" fi echo "Creating emulator" echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-30;google_apis;x86' echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-30;google_apis;x86' --force $ANDROID_HOME/emulator/emulator -list-avds echo "Starting emulator" nohup $ANDROID_HOME/emulator/emulator -avd android_emulator -wipe-data $EMULATOR_OPTS -skin 1080x1920 -no-snapshot -no-audio -no-boot-anim -qemu -lcd-density 420 & echo "<>checking if emulator has started<>" MAX_WAIT=120 ELAPSED=0 $ANDROID_HOME/platform-tools/adb wait-for-device while [[ -z $($ANDROID_HOME/platform-tools/adb shell getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1 ELAPSED=$((ELAPSED+1)) if [[ $ELAPSED -ge $MAX_WAIT ]]; then echo "Emulator boot timed out after $MAX_WAIT seconds" exit 1 fi done $ANDROID_HOME/platform-tools/adb shell input keyevent 82 $ANDROID_HOME/platform-tools/adb devices echo "Emulator started"
5. 延长启动超时等待时间
部分CPU启动模拟器速度较慢,延长等待时间避免误判启动失败:
修改adb等待逻辑,增加最大等待时长:
MAX_WAIT=120 ELAPSED=0 $ANDROID_HOME/platform-tools/adb wait-for-device while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1 ELAPSED=$((ELAPSED+1)) if [[ $ELAPSED -ge $MAX_WAIT ]]; then echo "Emulator boot timed out" exit 1 fi done input keyevent 82
内容的提问来源于stack exchange,提问作者syedkraken
相关产品推荐
相关产品推荐

