如何让adb命令在所有已连接设备上并行执行(替代逐个执行方式)
让adb命令在所有连接设备上并行执行的脚本修改方案
要让adb命令在所有已连接设备上同时执行(而非逐个排队),核心是把每个设备的操作放到后台异步运行。下面是修改后的完整脚本,以及关键改动的说明:
修改后的脚本
function install(){ # 过滤出有效的设备ID,跳过标题行和空行 devices=$(adb devices | grep -v "List of devices attached" | awk '{print $1}' | grep -v '^$') # 遍历每个设备,将操作放到后台并行执行 for device in $devices; do { echo "=== Starting operations on device: $device ===" # 安装APK adb -s "$device" install xxxx.apk if [ $? -eq 0 ]; then echo "APK installed successfully on $device" else echo "Failed to install APK on $device" continue # 安装失败则跳过后续操作 fi # 启动应用 echo "Launching application on $device...." package='com.xxxx' activity='com.xxxx.MainFrm' adb -s "$device" shell am start -n $package/$activity # 模拟按键和触摸操作 adb -s "$device" shell input keyevent 26 sleep 3 adb -s "$device" shell input tap 198 393 sleep 1 adb -s "$device" shell input swipe 198 390 198 80 1500 sleep 2 adb -s "$device" shell input tap 198 300 echo "=== Completed all operations on device: $device ===" } & # 后台运行当前设备的所有操作 done # 等待所有后台进程完成后再结束脚本 wait echo "✅ All devices have finished installation and configuration!" }
关键改动说明
- 更可靠的设备列表获取:用
grep -v跳过标题行和空行,awk提取设备ID,避免原脚本中cut命令可能因空格处理不当导致的错误。 - 后台并行执行:将每个设备的操作包裹在
{ ... } &中,让每个设备的任务在独立的后台进程中运行,实现多设备同时操作。 - 显式设备指定:统一使用
adb -s "$device"指定目标设备,语法更规范,避免设备ID含特殊字符时出现问题。 - 错误处理优化:增加APK安装结果的判断,安装失败时跳过后续操作,避免无效的按键/触摸指令。
- 等待所有任务完成:末尾的
wait命令会让主脚本等待所有后台的设备操作全部完成后再退出,确保所有设备的流程都执行完毕。 - 日志标识增强:添加设备ID的日志分隔线,方便区分不同设备的执行状态,排查问题更清晰。
注意事项
- 并行执行会同时占用多个设备的adb连接,若设备数量极多(比如10+),可以根据实际情况调整,但一般场景下不会有性能问题。
- 确保
xxxx.apk的路径在脚本执行环境中是可访问的(建议使用绝对路径),所有后台进程会继承主脚本的工作目录。 - 若某台设备的adb命令执行失败,该设备的后台进程会自行终止,不会影响其他设备的操作,可通过终端输出的日志定位问题设备。
内容的提问来源于stack exchange,提问作者Sasha Milic




