HarmonyOS 鸿蒙Next多模块项目中,如何设计 hdc + 自动化脚本实现多设备批量验证?

HarmonyOS 鸿蒙Next多模块项目中,如何设计 hdc + 自动化脚本实现多设备批量验证? 批量安装 HAP 时,hdc install 的失败重试和超时机制如何实现?特别是在模拟器场景下,设备启动完成到可安装之间存在一个不确定窗口

9 回复

有帮助

更多关于HarmonyOS 鸿蒙Next多模块项目中,如何设计 hdc + 自动化脚本实现多设备批量验证?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


通过自动化脚本(如 Shell、Python 或 Jenkins pipeline)遍历设备列表,为每个设备启动一个独立的 hdc -t 会话线程或子进程,实现多设备并行安装、启动和测试。

学习了

hdc只是个工具,里面不集成自动化功能,建议还是通过python脚本+hdc实现。只依靠hdc不能实现

多设备批量验证建议把“设备发现、设备就绪、安装、启动、测试、卸载/清理”拆成状态机,不要只写一个 for 循环直接 hdc install。每条 hdc 命令都带 -t deviceId,日志也按 deviceId 分目录保存,避免多设备输出互相覆盖。

安装重试可以只针对可恢复错误:device offline、timeout、install session busy、模拟器刚启动未 ready;签名不匹配、包名冲突、缺权限、解析失败这类应直接失败。模拟器场景最好先轮询 boot completed/ability shell 可用,再安装;失败列表单独落盘,下一轮只重试失败设备和失败 HAP。

我这边建议把它拆成“设备维度流水线”,不要让多台设备共享同一个临时目录,也不要只看最后一个退出码。关键点是:先固定 connect-key,后续每条命令都带 hdc -t;多模块项目再把 hap、bundleName、moduleName、testRunner 做成配置表。

一个可落地的 PowerShell 骨架如下,先串行跑通,再考虑并发:

$hap = "D:\build\entry-default-signed.hap"
$bundle = "com.example.demo"
$ability = "EntryAbility"
$runner = "ActsAbilityTest"
New-Item -ItemType Directory -Force logs | Out-Null

$targets = (& hdc list targets) | Where-Object {
$_ -and $_ -notmatch 'Empty|Unauthorized|Offline'
}

foreach ($t in $targets) {
$safe = $t -replace '[:\/]', '_'
$log = "logs\$safe.log"
"[$t] start $(Get-Date -Format s)" | Out-File $log

& hdc -t $t install -r $hap *>> $log
if ($LASTEXITCODE -ne 0) {
"install failed" | Add-Content $log
continue
}

& hdc -t $t shell "aa start -b $bundle -a $ability -W" *>> $log
& hdc -t $t shell "aa test -b $bundle -m entry_test -s timeout 10000 -s unittest $runner" *>> $log
}

再往上做一层汇总:每台设备一个日志、一个状态文件,失败设备写入 failed.txt,二次只重跑 failed.txt。等串行稳定后再用受限并发,例如 2-3 台一组,避免 hdc server、USB Hub 或无线调试链路本身成为变量。

参考:

华为开发者文档《hdc调试命令》

华为开发者文档《aa工具》

可以把安装成功的记录写入日志文件吧,然后如果有失败的,再执行一次不在安装成功的名单里的,就是安装失败和超时的。

在鸿蒙Next多模块项目中,使用hdc工具结合Shell/Python脚本实现批量验证。先通过hdc list targets获取设备序列,循环遍历并用-t参数指定设备,依次执行hdc -t <serial> install安装模块包,再运行hdc -t <serial> shell aa start启动测试或执行自动化用例。建议使用xargs -P或Python subprocess并发执行,提升效率。

在批量自动化验证中,对 hdc install 的失败重试和超时可通过脚本轮询设备启动状态并管控安装重试窗口来解决,尤其适合模拟器启动延迟。

核心思路:先等待设备完全启动(sys.boot_completed=1),再执行安装;安装失败时按次数重试,并设置超时总控。以 Bash 脚本为例:

wait_boot() {
  local dev=$1 timeout=60 elapse=0
  while [ $elapse -lt $timeout ]; do
    status=$(hdc -t "$dev" shell getprop sys.boot_completed 2>/dev/null | tr -d '\r')
    [ "$status" = "1" ] && return 0
    sleep 2; elapse=$((elapse+2))
  done
  return 1
}

install_with_retry() {
  local dev=$1 hap=$2 max_retry=3 cnt=0
  while [ $cnt -lt $max_retry ]; do
    hdc -t "$dev" install -r "$hap" && return 0
    sleep $((cnt+1))
    cnt=$((cnt+1))
  done
  return 1
}

# 批量验证入口
for dev in $(hdc list targets -v | awk '{print $1}'); do
  wait_boot "$dev" || { echo "Device $dev boot timeout"; continue; }
  for hap in /path/to/*.hap; do
    install_with_retry "$dev" "$hap" || echo "Install failed: $hap on $dev"
  done
done

原理说明wait_boot 规避模拟器“启动完成‑可安装”窗口的不确定性,通过轮询系统属性精确判断就绪。install_with_retryhdc install 的非0返回做有限重试(常因服务未就绪返回码40),避免偶发失败导致验证中断。最后串行(也可改为并行)处理多设备多 HAP,实现稳定批量验证。

回到顶部