Azure DevOps管道启动Android19模拟器报tr: not found错误
问题根因
核心报错/system/bin/sh: tr: not found来自模拟器内部的shell环境:Android 19(API 19,对应Android 4.4 KitKat)x86系统镜像做了高度精简,内置的系统shell没有自带tr文本处理工具。
原有流水线的开机等待逻辑把tr -d '\r'的过滤操作放在了传给模拟器执行的shell语句块中,高版本Android系统镜像(比如你测试正常的API 28)内置了tr工具所以可以正常运行,API 19镜像找不到该命令就会持续报错,永远无法完成开机状态判定,导致后续测试步骤无法执行。
流水线调整方案
需要做3处适配修改:
- 把回车符过滤的逻辑从模拟器侧移到流水线宿主机(macOS运行机)侧执行,不依赖模拟器内置的命令工具
- 给模拟器启动命令补充老版本镜像兼容参数,避免启动黑屏、GPU渲染异常、音频服务占用导致的卡死问题
- 拆分开机等待逻辑,先等adb识别设备,再循环校验开机状态,避免老版本模拟器启动过程中adb短暂断连导致流程卡住
替换后的模拟器启动步骤
将原有YAML中Start emulator对应的bash步骤直接替换为以下内容:
- bash: | # 后台启动Android 19模拟器,追加兼容参数 nohup $ANDROID_HOME/emulator/emulator -avd xamarin_android_emulator \ -no-snapshot -no-audio -no-boot-anim \ -gpu swiftshader_indirect -netdelay none -netspeed full \ > /dev/null 2>&1 & # 等待adb服务识别到模拟器设备 $ANDROID_HOME/platform-tools/adb wait-for-device # 开机状态校验逻辑放在宿主机执行,不依赖模拟器内置tr命令 BOOT_COMPLETED="" while [ -z "$BOOT_COMPLETED" ]; do sleep 1 # 拉取开机状态属性,在宿主机侧过滤返回内容中的回车、换行符 BOOT_COMPLETED=$($ANDROID_HOME/platform-tools/adb shell getprop sys.boot_completed | tr -d '\r\n') done # 发送按键事件解锁模拟器屏幕 $ANDROID_HOME/platform-tools/adb shell input keyevent 82 # 打印当前已连接设备列表确认状态 $ANDROID_HOME/platform-tools/adb devices echo "Emulator started" displayName: 'Start emulator'
异常兜底调整
如果替换上述配置后仍然出现模拟器启动超时的问题,可以在安装系统镜像的步骤中补充安装API 19对应的平台SDK、确认使用兼容版模拟器组件,修改后的镜像安装步骤如下:
- bash: | # 安装AVD镜像及对应版本兼容依赖 echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install \ 'system-images;android-19;google_apis;x86' \ 'platforms;android-19' echo "AVD system-image successfully downloaded and installed." displayName: 'Download and install emulator image'
内容的提问来源于stack exchange,提问作者user264953
相关产品推荐
相关产品推荐

