怎么在安卓上使用Auto.js编写并执行JavaScript自动化脚本

作者:脚本小铺

时间:2026-10-30

浏览:265

详细介绍在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自动化脚本
图1: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)),避免界面加载缓慢导致代码抛出空引用崩溃;对不可点击的包裹节点提供回退点击策略;关键步骤通过日志输出以便调试。

怎么在安卓上使用Auto.js编写并执行JavaScript自动化脚本
图2:Auto.js基于Android无障碍与JS引擎的系统通信架构原理

三、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 提供了极其方便的“布局分析”悬浮工具:

  1. 开启 Auto.js 悬浮窗,切换到需要抓取的目标 App 界面。
  2. 点击 Auto.js 悬浮窗小图标,选择“布局分析”或瞄准图标。
  3. 选择“悬浮窗检索”或“生成布局代码”,点击屏幕上的目标元素。
  4. 系统会弹出该控件的节点详情,包括 id、text、desc、className 以及在节点树中的层级关系,并能直接复制生成的选择器语句。
怎么在安卓上使用Auto.js编写并执行JavaScript自动化脚本
图3:无障碍节点树分析与选择器查找逻辑

四、脚本执行、控制台调试与多线程处理

编写完成的脚本通常有三种执行途径:在Auto.js应用内部点击右下角运行三角形、通过屏幕侧边的悬浮窗浮标直接选中文件运行,或者配置为定时广播任务自动唤醒。

1. 实时调试与日志监控

自动化测试最常遇到的问题是“脚本停在某一处不继续执行”。因此在编写代码时,必须善用日志:

  • console.show():在手机屏幕最上层显示一个半透明的黑色悬浮日志窗口,脚本的运行输出会实时滚动展示。
  • log("信息") 与 toast("弹窗提示"):log输出至控制台,toast则调用安卓系统底部轻量提示框。
  • console.clear() 与 console.hide():在任务结束时清理并隐藏窗口,恢复屏幕清爽。

2. 防止死循环与紧急停止机制

自动化脚本一旦陷入无限循环的界面滑动或点击,用户很难手动触控手机屏幕进行抢救。因此,在部署任何复杂逻辑之前,必须先在Auto.js的“设置”中开启“音量键停止所有脚本”选项。当脚本失控时,只需按下手机的音量减小键,Auto.js就会立刻终止当前运行的线程并注销事件响应。

怎么在安卓上使用Auto.js编写并执行JavaScript自动化脚本
图4:Auto.js脚本生命周期、异常保护与调试总结

五、常见问题排查与关键边界说明

1. 无障碍服务频繁自动失效或关闭
这是安卓自动化中最常见的系统限制。多数深度定制ROM(如MIUI、ColorOS、OriginOS等)出于省电与安全机制,会在应用切到后台一段时间后悄悄重置无障碍服务。
解决办法:
  • 进入手机“应用信息 > 电池 > 后台耗电管理”,将Auto.js设为“允许后台高耗电”或“无限制”。
  • 开启Auto.js的“自启动”和“关联启动”权限。
  • 在系统多任务卡片视图中,长按Auto.js并点击“加锁”图标。
  • 在脚本头部加入 auto.waitFor(),如果发现无障碍关闭,Auto.js会自动尝试重新拉起或弹窗提示。
2. findOne() 找到了控件,但调用 .click() 却没有任何反应
在Android的View层级中,显示文本的子节点(如TextView)往往将其属性 clickable 设置为 false,真正绑定点击事件的是它的父级容器(如 LinearLayout 或 RelativeLayout)。
排查方案:
  1. 在代码中检查 node.clickable() 是否为 true。如果是 false,可以调用 node.parent().click() 向上寻找可点击的父节点。
  2. 直接获取该控件在屏幕上的边界坐标,使用手势模拟:click(node.bounds().centerX(), node.bounds().centerY())。由于基于控件动态计算中心坐标,这种写法同样具备良好的屏幕自适应能力。
3. 游戏与自绘界面(Flutter / Unity / WebView)为什么无法用选择器?
Auto.js的无障碍选择器依赖Android标准的系统原生组件树。如果目标软件采用自绘引擎(如Unity游戏、部分未开启无障碍辅助的Flutter页面或纯Canvas绘制),系统无障碍服务只能抓到一个统一的 SurfaceView 或空白容器,此时内部按钮没有节点信息。
对于这种场景,必须改用图片识别(找图/找色)或比例坐标计算的方式:通过 requestScreenCapture() 申请截图权限,配合 images.findImage() 在屏幕中匹配目标按钮图标并触发点击。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章