怎么在安卓上使用Auto.js编写并执行JavaScript自动化脚本
详细介绍在Android系统上使用Auto.js编写与执行JavaScript自动化脚本的完整操作流程,涵盖无障碍权限配置、UI控件选择器定位、模拟手势、脚本调试及后台保活策略。
在安卓设备上使用Auto.js执行自动化操作,核心在于利用Android系统的“无障碍服务”(Accessibility Service)分析当前屏幕上的控件节点树,并通过内置的JavaScript解释器驱动节点模拟点击、文本输入以及屏幕手势。掌握这一流程的关键,在于按规范配置核心系统权限、理解基于控件特性的选择器语法,并建立严谨的超时处理与脚本中断保护机制。
一、运行环境准备与核心系统权限配置
Auto.js免除了手机Root权限的依赖,但作为底层的自动化运行容器,必须依赖安卓系统赋予的两项关键系统权限:无障碍权限和悬浮窗显示权限。此外,为了防止自动化执行过程中脚本因系统省电策略被强制中断,还需要针对应用进行后台运行保活配置。
- 无障碍服务(Accessibility Service):这是Auto.js实现控件识别与系统动作模拟的核心桥梁。开启后,Auto.js才能获取当前活动窗口的UI节点树并触发点击。在手机“系统设置 > 无障碍(已安装的服务)”中找到Auto.js并开启开关。
- 悬浮窗权限(Display Over Other Apps):在运行脚本时,悬浮窗提供关键的运行按钮、停止开关、日志浮窗以及布局分析指针。进入手机“应用权限管理 > Auto.js > 悬浮窗”,设为“允许”。
- 电池优化与后台常驻:将Auto.js的电池管理策略设置为“无限制”或“不进行省电优化”,并在手机多任务界面将Auto.js锁定在后台,避免执行长任务时进程被杀。
二、编写第一个自动化脚本(基本语法与控件操作)
Auto.js内置了JavaScript引擎(早期版本基于Mozilla Rhino引擎,部分现代分支版本支持Node.js环境)。在Auto.js中编写代码,既可以使用ES5/ES6的基础语法,也能直接调用注入到全局作用域中的安卓控制函数(如 app、device、click、text 等对象)。
自动化脚本的基本工作逻辑是:首先检测无障碍服务是否就绪,随后启动目标应用,等待目标页面的关键UI元素渲染完成,再定位到目标节点并触发动作。
// 1. 确保无障碍服务已启动,若未启动则跳转至系统设置等待用户开启
auto.waitFor();
// 2. 唤醒屏幕并设置控制台浮窗
device.wakeUpIfNeeded();
console.show();
log("正在启动自动化流程...");
// 3. 启动目标应用(以安卓系统设置或便签为例)
var targetAppName = "设置";
var launchResult = app.launchApp(targetAppName);
if (!launchResult) {
log("未找到应用: " + targetAppName);
exit();
}
log("已打开应用,等待界面加载...");
// 4. 等待界面中出现指定文字的控件(最多等待5000毫秒)
var searchBar = text("搜索设置项").findOne(5000);
if (searchBar) {
log("定位到搜索框,准备点击");
// 优先点击控件本身,若控件本身不可点击则尝试点击其所在中心坐标
if (searchBar.clickable()) {
searchBar.click();
} else {
click(searchBar.bounds().centerX(), searchBar.bounds().centerY());
}
// 等待输入法或输入框准备就绪后输入文本
sleep(1000);
setText("WLAN");
log("已填充搜索关键字: WLAN");
} else {
log("等待超时,未找到指定的搜索控件");
}
// 5. 等待执行并关闭控制台
sleep(3000);
log("脚本执行完毕");
console.hide();
上述代码演示了编写Auto.js脚本的4个关键原则:必须使用 auto.waitFor() 显式校验运行前提;操作对象前必须设置带有超时的等待(如 findOne(5000)),避免界面加载缓慢导致代码抛出空引用崩溃;对不可点击的包裹节点提供回退点击策略;关键步骤通过日志输出以便调试。
三、UI控件定位机制与选择器深入
在编写自动化脚本时,最脆弱的实现方式是直接基于屏幕固定坐标执行点击(例如 click(500, 1200))。当脚本运行在不同分辨率、不同屏幕比例(如折叠屏、平板或水滴屏)的手机上时,硬编码的坐标会导致点击完全偏移。Auto.js推崇的核心机制是基于控件属性的无障碍选择器(UiSelector)。
1. 常用选择器函数与属性匹配
| 选择器函数 | 匹配依据 | 适用场景与示例 |
|---|---|---|
| text("内容") | 控件的显示文本完全匹配 | 按钮、列表标题,如 text("确认").findOne() |
| textContains("关键字") | 控件文本包含指定子串 | 动态更新的时间或带有数字的标签 |
| id("资源ID") | Android组件的 Resource ID | 最稳定的定位方式,如 id("btn_submit").findOne() |
| desc("描述内容") | ContentDescription 属性 | 常用于无文本的图标按钮(如返回、设置图标) |
| className("类名") | Android UI 类名 | 辅助筛选,如 className("android.widget.EditText") |
2. 使用“布局分析”抓取属性
如何知道目标按钮的 id 或 desc 是什么?Auto.js 提供了极其方便的“布局分析”悬浮工具:
- 开启 Auto.js 悬浮窗,切换到需要抓取的目标 App 界面。
- 点击 Auto.js 悬浮窗小图标,选择“布局分析”或瞄准图标。
- 选择“悬浮窗检索”或“生成布局代码”,点击屏幕上的目标元素。
- 系统会弹出该控件的节点详情,包括 id、text、desc、className 以及在节点树中的层级关系,并能直接复制生成的选择器语句。
四、脚本执行、控制台调试与多线程处理
编写完成的脚本通常有三种执行途径:在Auto.js应用内部点击右下角运行三角形、通过屏幕侧边的悬浮窗浮标直接选中文件运行,或者配置为定时广播任务自动唤醒。
1. 实时调试与日志监控
自动化测试最常遇到的问题是“脚本停在某一处不继续执行”。因此在编写代码时,必须善用日志:
- console.show():在手机屏幕最上层显示一个半透明的黑色悬浮日志窗口,脚本的运行输出会实时滚动展示。
- log("信息") 与 toast("弹窗提示"):log输出至控制台,toast则调用安卓系统底部轻量提示框。
- console.clear() 与 console.hide():在任务结束时清理并隐藏窗口,恢复屏幕清爽。
2. 防止死循环与紧急停止机制
自动化脚本一旦陷入无限循环的界面滑动或点击,用户很难手动触控手机屏幕进行抢救。因此,在部署任何复杂逻辑之前,必须先在Auto.js的“设置”中开启“音量键停止所有脚本”选项。当脚本失控时,只需按下手机的音量减小键,Auto.js就会立刻终止当前运行的线程并注销事件响应。
五、常见问题排查与关键边界说明
这是安卓自动化中最常见的系统限制。多数深度定制ROM(如MIUI、ColorOS、OriginOS等)出于省电与安全机制,会在应用切到后台一段时间后悄悄重置无障碍服务。
解决办法:
- 进入手机“应用信息 > 电池 > 后台耗电管理”,将Auto.js设为“允许后台高耗电”或“无限制”。
- 开启Auto.js的“自启动”和“关联启动”权限。
- 在系统多任务卡片视图中,长按Auto.js并点击“加锁”图标。
- 在脚本头部加入 auto.waitFor(),如果发现无障碍关闭,Auto.js会自动尝试重新拉起或弹窗提示。
在Android的View层级中,显示文本的子节点(如TextView)往往将其属性 clickable 设置为 false,真正绑定点击事件的是它的父级容器(如 LinearLayout 或 RelativeLayout)。
排查方案:
- 在代码中检查 node.clickable() 是否为 true。如果是 false,可以调用 node.parent().click() 向上寻找可点击的父节点。
- 直接获取该控件在屏幕上的边界坐标,使用手势模拟:click(node.bounds().centerX(), node.bounds().centerY())。由于基于控件动态计算中心坐标,这种写法同样具备良好的屏幕自适应能力。
Auto.js的无障碍选择器依赖Android标准的系统原生组件树。如果目标软件采用自绘引擎(如Unity游戏、部分未开启无障碍辅助的Flutter页面或纯Canvas绘制),系统无障碍服务只能抓到一个统一的 SurfaceView 或空白容器,此时内部按钮没有节点信息。
对于这种场景,必须改用图片识别(找图/找色)或比例坐标计算的方式:通过 requestScreenCapture() 申请截图权限,配合 images.findImage() 在屏幕中匹配目标按钮图标并触发点击。
JS压缩后代码报错怎么调试?Source Map使用详解
2026-11-05 09:05:04
JS压缩会破坏代码逻辑吗?兼容性风险与测试建议
2026-11-03 17:13:03
Next.js 与 Vite、Create React App 的优缺点对比
2026-11-03 15:27:33
js文件加载失败或404错误的常见原因与排查
2026-11-03 10:38:55
前端项目打包生成 JS 文件的核心步骤完整记录
2026-10-31 21:04:46








