uiautomator2详解:告别重复的手机操作!
作为一个 Android 用户或测试工程师,你是不是也经常陷在这些重复劳动里:
- 测试新功能时,同一套注册、登录、填表单流程要手动走一百遍;
- 每天打开一堆 App 打卡、签到、做任务,重复到怀疑人生;
- 不想 Root 手机,又想用代码控制安卓界面,结果被 Google 原生的 uiautomator 劝退。
字节跳动基于安卓原生 UIAutomator 二次封装的 Python 轻量级自动化库 uiautomator2,正好解决了这些问题——无需 Root、非侵入式、上手极快。它既能满足日常 UI 自动化测试的需求,也能作为个人学习或轻量自动化的基础工具(请务必在合法范围内使用)。
这篇文章会带你从 极简environment-setup → 核心工具类封装 → 抖音信息流模拟实战 → 避坑与反检测建议,用一小时拿下这个实用工具。
一、基础配置:两步搞定安装
1.1 安装 Python 核心库与辅助工具
国内用户优先使用清华源或豆瓣源,下载速度能快 10 倍以上:
1.2 设备首次连接(仅需一次)
这一步需要你在手机上稍微操作一下,之后电脑会记住配置,全程自动连接。
-
开启开发者选项与调试权限
打开手机 设置 → 关于手机,连续点击 “版本号” 7 次,进入开发者模式。
然后进入 设置 → 开发者选项,开启 “USB 调试”、“USB 安装”,如果需要测试地图等功能,可以顺带打开 “允许模拟位置”。 -
用数据线连接电脑
连接时选择 “文件传输”(MTP)模式。打开命令行检查 adb 是否已识别设备:如果看到设备序列号,表示连接成功。
-
首次运行自动推送服务
第一次在 Python 中连接设备时,uiautomator2 会自动向手机推送并安装两个关键组件:ATX-Agent:设备端的服务管理程序uiautomator2-server:负责 UI 交互的核心服务
⚠️ 重要提醒:安装完成后,一定要在手机上手动允许 ATX-Agent 的悬浮窗权限。MIUI、ColorOS、Funtouch OS 等系统往往需要去“应用权限”里单独开启,否则可能出现无法正常定位元素的情况。
二、核心工具类封装:写一次,到处用
uiautomator2 自带的 API 已经非常友好,但如果每个脚本都要重复写设备连接、元素查找、手势滑动,代码会越来越臃肿。我们可以把这些高频操作封装成一个轻量级工具类 U2Controller,大幅提升开发效率。
使用建议:
- 单设备测试,直接
ctrl = U2Controller()即可;- 多设备并行,传入序列号
ctrl = U2Controller("设备序列号"),每个实例独立操控一台手机。
三、实战演示:抖音轻量级信息流交互
接下来用一个贴近真实场景的例子,展示上面工具类的实战能力——模拟用户刷抖音、随机点赞、偶尔评论。请务必仅用于自动化测试或非盈利学习。
3.1 先用 weditor 摸清界面布局
启动 weditor:
浏览器会自动打开一个页面,选择对应设备后,就可以看到手机实时画面和完整的 UI 层级树。我们可以通过 weditor 查看抖音的控件结构,但为了适配不同屏幕和版本更新,我们的脚本会优先使用比例坐标和属性定位相结合的方式。
3.2 编写自动化交互脚本
四、避坑与反检测指南
4.1 常见坑点与解决方法
-
元素定位优先级
✅resourceId(唯一,不随 UI 改版或多语言变化)
✅description(无障碍文本)
👉text(多语言或 UI 改版可能变化)
👉class_name(容易重复)
⚠️xpath(性能略低,长列表中可能定位不准)
优先使用前两种,稳定又高效。 -
悬浮窗权限
务必确保 ATX-Agent 的悬浮窗权限已经开启,否则很多依靠无障碍服务的定位方式会失效。 -
多设备管理
通过adb devices获取设备序列号,为每个设备创建独立的U2Controller实例,避免互相干扰。 -
网络波动
实战中尽量使用显式等待(例如element.wait())代替固定time.sleep(),避免因网络卡顿导致操作失败。
4.2 基础反检测思路(仅供学习参考)
如果你在非盈利学习或自动化测试中使用这些脚本,可以加上以下“拟人化”操作,降低被识别为机器的概率:
- 随机化一切:观看时长、滑动距离、点击坐标、操作间隔,全部加入随机波动。
- 行为多样化:不要连续点赞、不要一直往下刷,偶尔进入评论区只看不发,偶尔切到后台再回来。
- 合理控制频率:别 24 小时不间断运行,模拟正常作息,每天控制在合理的时间段内。
五、合法声明
本文提供的所有代码和技术思路,仅限用于 合法的 Android 应用自动化测试 和 非盈利性的个人学习研究。请勿将其用于任何恶意刷量、虚假数据、违规采集或其他违法行为,否则由此产生的一切后果由使用者自行承担。

