Azure DevOps远程构建Android模拟器动画禁用失败问题求助
问题分析与解决
错误含义
Broken pipe (32):ADB与模拟器的通信管道意外中断,多因连接不稳定或目标服务未就绪导致Can't find service: settings:模拟器的settings系统服务尚未完成初始化,无法响应命令
偶发成因
- 服务初始化延迟:虽然
sys.boot_completed标志已置1,但Android系统核心服务(包括settings)可能仍在后台加载,此时执行settings命令会失败 - 远程环境资源波动:Azure DevOps构建代理的CPU/内存被其他任务挤占,导致模拟器服务启动速度变慢
- ADB连接不稳定:远程网络环境下,ADB与模拟器的连接偶发中断,引发管道错误
解决方法
1. 优化等待逻辑,确保settings服务就绪
修改等待脚本,在sys.boot_completed之后增加对settings服务可用性的检查:
echo "Wait for emulator and settings service ready" adb devices | awk 'NR>1 && /emulator/ {print $1}' | xargs -n1 -I% bash -c ' adb -s % wait-for-device # 等待系统启动完成 while [[ -z $(adb -s % shell getprop sys.boot_completed) ]]; do sleep 1; done # 等待settings服务可用 while ! adb -s % shell service check settings >/dev/null 2>&1; do sleep 1; done '
2. 为settings命令添加重试机制
对每个settings命令增加重试逻辑,避免单次失败导致脚本终止:
# 定义重试函数 retry_adb_settings() { local serial=$1 local cmd=$2 local max_retries=5 local retry_count=0 while (( retry_count < max_retries )); do if adb -s "$serial" shell "$cmd"; then return 0 fi (( retry_count++ )) echo "Retry $retry_count/$max_retries for $serial..." sleep 2 done return 1 } # 执行禁用动画命令 adb devices | awk 'NR>1 && /emulator/ {print $1}' | xargs -n1 -I% bash -c ' retry_adb_settings % "settings put global window_animation_scale 0.0" retry_adb_settings % "settings put global transition_animation_scale 0.0" retry_adb_settings % "settings put global animator_duration_scale 0.0" '
3. 合并重复的设备遍历逻辑
减少重复执行adb devices的次数,提升脚本效率:
echo "Disable animations" # 获取所有模拟器设备列表 EMULATORS=$(adb devices | awk 'NR>1 && /emulator/ {print $1}') for serial in $EMULATORS; do echo "Processing emulator: $serial" # 等待设备和服务就绪 adb -s "$serial" wait-for-device while [[ -z $(adb -s "$serial" shell getprop sys.boot_completed) ]]; do sleep 1; done while ! adb -s "$serial" shell service check settings >/dev/null 2>&1; do sleep 1; done # 禁用动画(带重试) retry_adb_settings "$serial" "settings put global window_animation_scale 0.0" retry_adb_settings "$serial" "settings put global transition_animation_scale 0.0" retry_adb_settings "$serial" "settings put global animator_duration_scale 0.0" # 验证设置 echo "Verifying animation scale for $serial:" adb -s "$serial" shell settings get global window_animation_scale done
4. 加强Azure DevOps环境资源保障
- 为模拟器任务分配Premium代理池,确保足够的CPU/内存资源
- 避免在同一代理上并行运行其他资源密集型任务
内容的提问来源于stack exchange,提问作者Zeek Aran
相关产品推荐
相关产品推荐

