uiautomator2多进程并发最稳,需先运行python -m uiautomator2 init安装atx-agent和uiautomator apk,usb不稳定时改用adb connect网络连接,多设备必须用multiprocessing且每进程独立connect,避免threading串扰。

直接用 uiautomator2 多进程并发控制最稳,比 Appium 省端口、比纯 ADB 命令能操作 UI 元素,且设备间完全隔离——关键在初始化、连接方式和线程/进程模型选型。
uiautomator2 初始化失败:手机没装 ATX-Agent 就连不上
不装 ATXAgent.apk 和 app-uiautomator.apk,uiautomator2 无法获取 UI 树或执行点击/输入等操作,会卡在 connect_usb() 或报错 UiAutomation not connected。
- 首次使用必须运行
python -m uiautomator2 init(自动推包+启动服务),不能跳过 - 若手动安装,需确认两个 APK 都已启用“允许安装未知来源应用”,并在手机上点“安装”完成授权
- 部分 Android 12+ 设备需额外开启“无障碍服务”中
ATX Agent的开关,否则d.info返回空或超时 - USB 连接不稳定时,建议改用
adb connect IP:5555走网络调试,再用u2.connect("IP:5555")
多设备并发:用 multiprocessing 而不是 threading
uiautomator2 底层依赖 adb shell 和 socket 通信,threading 下多个线程共用同一套 adb client 容易出现命令串扰、device offline 或元素查找失败;multiprocessing 每个进程独占 adb 实例,更可靠。
- 不要写
threading.Thread(target=run_on_device, args=(d,)),改用multiprocessing.Process - 每个进程内调用
u2.connect(device_id),传入唯一 serialno(如"0123456789ABCDEF"或"192.168.1.10:5555") - 避免在主进程中提前调用
u2.connect()再传对象——uiautomator2.Device实例不可跨进程序列化 - 进程数建议 ≤ 设备数,别设成
cpu_count(),否则 adb 负载过高导致 timeout
元素定位失败:dumpsys 与 uiautomator2 的层级差异
uiautomator2 默认用 uiautomator(Android 5.0+)抓 UI 树,但某些定制 ROM 或低版本(如 Android 4.4)只支持 dumpsys window windows,会导致 d(text="确定").click() 找不到控件。
- 检查设备 API 级别:
adb -s DEVICE_ID shell getprop ro.build.version.sdk,低于 19 建议换方案(如 pure-python-adb + 坐标点击) - 强制降级回 dumpsys 模式:
d = u2.connect(device_id, use=u2.DEFAULT_USE_DUMPSYS) - ID 定位失效时优先试
resourceId,其次text或description,避免用className(不同系统类名不一致) - 动态界面(如 WebView)需先
d.xpath("//android.webkit.WebView").wait(timeout=5),再用d(focused=True).send_keys(...)
批量操作时的设备状态校验不能省
群控脚本跑着跑着某台设备断开 USB 或崩溃,后续命令全失败,但默认不会抛异常中断其他设备——必须每步前加状态探测。
- 每次操作前加
if not d.alive:+d.healthcheck(),失败则重连或跳过该设备 - 避免
d.app_start("com.xxx.yyy")后立刻操作,加d.wait_activity(".MainActivity", timeout=10) - 对关键步骤(如登录、支付)加截图存档:
d.screenshot(f"fail_{device_id}_{int(time.time())}.png") - adb devices 输出可能延迟,用
subprocess.run(["adb", "-s", device_id, "get-state"], capture_output=True)实时查在线状态
真正难的不是“怎么让十台机同时点屏幕”,而是每台机的 UI 加载节奏、弹窗时机、网络延迟都不一样,硬同步必然崩;得接受异步+重试+状态兜底,而不是追求所有设备毫秒级一致。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











