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

微软托管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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 14:02:45