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

Azure DevOps远程构建Android模拟器动画禁用失败问题求助

问题分析与解决

错误含义

  • Broken pipe (32):ADB与模拟器的通信管道意外中断,多因连接不稳定或目标服务未就绪导致
  • Can't find service: settings:模拟器的settings系统服务尚未完成初始化,无法响应命令

偶发成因

  1. 服务初始化延迟:虽然sys.boot_completed标志已置1,但Android系统核心服务(包括settings)可能仍在后台加载,此时执行settings命令会失败
  2. 远程环境资源波动:Azure DevOps构建代理的CPU/内存被其他任务挤占,导致模拟器服务启动速度变慢
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:33:34