AutoJs6 脚本编写技能
概述
AutoJs6 是基于 Android 无障碍服务的 JavaScript 自动化工具,使用 Mozilla Rhino 引擎(非 V8/Node.js),可直接调用 Java API。
触发条件
以下情况必须使用此技能:
- 用户请求编写 AutoJs6 脚本("帮我写一个 AutoJs6 脚本来...")
- 用户询问 AutoJs6 API 用法("AutoJs6 中如何...")
- 用户需要开发指导或遇到错误
- 用户提到相关关键词:AutoJs6、autojs、auto.js、安卓自动化、控件操作、手机脚本自动点击等
工作流程
- 识别需求:判断用户需要脚本编写、API 查询还是错误排查
- 选择参考文件:根据问题类型读取对应的参考文件(见下方说明)
- 提供准确回答:从参考文件提取信息,提供正确的函数签名、参数、代码示例
- 验证准确性:确保与参考文档一致,包含必要的错误处理
参考文件说明(按需读取)
整合参考文件(快速概览)
本技能包含三个整合参考文件,适合快速确认 API 用法:
| 文件 |
内容 |
何时读取 |
references/api-core.json |
21个核心模块的所有方法签名与说明 |
需要确认任意 API 的用法、参数、返回值时 |
references/api-selector.json |
UiSelector(222方法) / UiObject(135方法) / UiObjectCollection(56方法) 完整API |
涉及控件选择、控件属性操作时 |
references/patterns-and-pitfalls.json |
权限说明、常用代码模式、Top错误列表、调试技巧、Rhino引擎特性 |
编写整体逻辑、权限判断、排查错误时 |
粒度参考文件(精确查询)
每个模块有独立的 JSON 文件,适合精确查找特定模块的详细 API:
| 功能领域 |
参考文件 |
| 自动化操作 |
automator.json, coordinates-based-automation.json, widgets-based-automation.json |
| 控件选择器 |
uiSelectorType.json, uiObjectType.json, uiObjectActionsType.json, uiObjectCollectionType.json |
| 应用和设备 |
app.json, appType.json, device.json, intent.json, intentType.json |
| UI 交互 |
ui.json, dialogs.json, floaty.json, canvas.json, progress.json, toast.json |
| 图像和 OCR |
image.json, imageWrapperType.json, ocr.json, color.json, colorTable.json |
| 文件和数据 |
files.json, storages.json, storageType.json |
| 网络和通信 |
http.json, web.json, webSocketType.json |
| 多线程和事件 |
threads.json, timers.json, events.json, eventEmitterType.json |
| 系统功能 |
shell.json, sensors.json, runtime.json, engines.json |
| 工具类 |
console.json, crypto.json, util.json, mathx.json, arrayx.json, numberx.json |
| 多媒体 |
media.json, recorder.json, barcode.json, qrcode.json |
| 其他 |
shizuku.json, plugins.json, notice.json, autojs.json |
完整索引见 references/index.md
规则:回答 AutoJs6 代码问题时,先读取对应参考文件,再输出代码,不得依赖记忆中的 API 写法。简单查询用整合文件,深入查询用粒度文件。
核心模块速览
references/api-core.json 包含以下模块的完整方法列表:
| 模块 |
主要功能 |
关键方法示例 |
automator |
触摸/手势模拟 |
click(x,y) swipe() gesture() input() |
widgetsBasedAutomation |
控件自动化全局函数 |
click(text) scrollUp() setText() auto() |
app |
应用管理、Intent |
launch() launchApp() startActivity() openUrl() |
console |
日志、控制台悬浮窗 |
log() show() rawInput() time() |
device |
设备信息与控制 |
width height getBattery() keepScreenOn() |
image |
截图、找色、模板匹配 |
captureScreen() findColor() findImage() matchTemplate() |
http |
HTTP 请求 |
get() post() postJson() request() |
files |
文件读写 |
read() write() exists() listDir() |
storages |
键值持久化存储 |
create() .get() .put() .remove() |
threads |
多线程 |
start() lock() atomic() disposable() |
events |
事件监听 |
onKeyDown() onTouch() onNotification() onToast() |
floaty |
悬浮窗 |
window() rawWindow() closeAll() |
dialogs |
对话框 |
alert() confirm() rawInput() select() |
global |
全局函数 |
sleep() toast() toastLog() exit() random() |
ui |
UI 界面 |
layout() inflate() run() post() |
shell |
Shell 命令 |
shell(cmd, root) |
media |
多媒体播放 |
playMusic() stopMusic() scanFile() |
sensors |
传感器 |
register() unregister() |
util |
工具函数 |
字符串/数组/对象辅助方法 |
crypto |
加解密 |
哈希、AES 等加密方法 |
base64 |
Base64 编解码 |
encode() decode() |
references/api-selector.json 包含:
- UiSelector(222个方法):
text() id() className() findOne() find() exists() waitFor() 等所有选择器
- UiObject(135个方法):控件属性读取、点击、输入、滚动、节点遍历等
- UiObjectCollection(56个方法):控件集合操作
权限速查
| 功能 |
所需权限 |
| selector 查找控件 / 模拟触摸 / 系统按键 |
无障碍服务 |
images.captureScreen() |
截图权限(首次弹授权框) |
floaty.window() / console.show() |
悬浮窗权限 |
shell(cmd, true) / events.onTouch() |
Root 权限 |
device.setBrightness() |
修改系统设置权限 |
通知监听 events.onNotification() |
通知服务权限 |
最常用代码模板
// ① 脚本开头:请求无障碍服务
auto.waitFor();
// ② 等待控件出现后点击(推荐写法)
let btn = text('确定').findOne(5000); // 加超时,不永久阻塞
if (btn) btn.click();
else console.log('未找到按钮');
// ③ 截图找色(必须 recycle)
let img = images.captureScreen();
let pt = images.findColor(img, '#FF0000', {threshold: 10});
if (pt) click(pt.x, pt.y);
img.recycle(); // ← 必须释放
// ④ 比例坐标(适配不同分辨率)
let W = device.width, H = device.height;
swipe(W*0.5, H*0.8, W*0.5, H*0.2, 500);
// ⑤ 本地存储(持久化)
let s = storages.create('myApp');
s.put('count', s.get('count', 0) + 1);
// ⑥ 多线程更新UI
threads.start(function() {
let result = doWork();
ui.run(() => textView.setText(result));
});
// ⑦ UI脚本开头必须声明
'ui';
ui.layout(<vertical>...</vertical>);
Top 常见错误速查
| 症状 |
原因 |
修复 |
| 控件操作全部无效 |
未开启无障碍服务 |
开头加 auto.waitFor() |
| 脚本永久卡死 |
findOne() 无超时 |
改为 findOne(5000) 并判断 null |
| 长时间运行后崩溃 |
Image 对象未回收 |
每次截图后 img.recycle() |
| ui 模块方法报错 |
忘写 'ui'; |
第一行加 'ui'; |
| 点击位置错误 |
固定坐标不适配 |
用 device.width/height 计算比例 |
| 子线程操作 View 报错 |
跨线程操作 UI |
改用 ui.run(() => {...}) |
| 悬浮窗脚本退出后残留 |
未关闭悬浮窗 |
退出前 floaty.closeAll() |
| dialogs 在 ui 模式卡死 |
阻塞了 UI 线程 |
用回调或 Promise 形式 |
| events 事件处理延迟 |
主线程有耗时操作 |
把耗时操作移到子线程 |
| captureScreen 每次弹框 |
未提前申请截图权限 |
脚本开头调用 images.requestScreenCapture() |
完整错误列表见 references/patterns-and-pitfalls.json → top_mistakes
回答规范
代码质量要求
- 必须
findOne() 加超时参数并处理 null
- 必须 截图操作后调用
img.recycle()
- 必须 无障碍脚本开头加
auto.waitFor()
- 必须 UI脚本第一行写
'ui';
- 推荐 使用比例坐标而非固定坐标
- 推荐 随机延迟模拟人工操作:
sleep(random(500, 1500))
回答格式
- 简述实现思路(1-2句)
- 提供完整可运行代码(含必要注释)
- 说明所需权限
- 关键注意点(不超过3条)
Rhino 引擎说明
AutoJs6 使用 Mozilla Rhino(非 V8),注意:
- 支持:
let/const / 箭头函数 / 模板字符串 / 解构 / Promise(基础)
- 不支持:顶层
await / WeakRef / 部分 ES2020+ 特性
- 特有:可直接使用 Java 类
new java.util.ArrayList()
- 可
importClass(java.io.File) 导入 Java 类
详见 references/patterns-and-pitfalls.json → rhino_engine_notes
注意事项
- 版本一致性:参考文件基于 AutoJs6 文档 v1.1.8,API 可能随版本更新变化
- 设备差异:不同 Android 设备/版本可能有行为差异,建议添加设备检测逻辑
- 错误处理:始终提供包含错误处理的代码示例,避免空指针、超时等问题
Relative paths (e.g., references/) are relative to this skill's directory (${CLAUDE_PLUGIN_ROOT}/skills/autojs6-doc/).
1---2name: autojs6-doc-skills3description: 编写 AutoJs6 自动化脚本的专业助手。在用户编写、调试 AutoJs6 脚本时使用此技能,包括:UI控件查找与操作、触摸/手势模拟、图像识别与截图、文件/HTTP/存储操作、多线程、事件监听、悬浮窗、对话框等。当用户提及 AutoJs6、autojs、auto.js 脚本编写、安卓自动化脚本、手机脚本自动点击等相关内容时,必须使用此技能以减少代码错误、提供准确API用法。4---56# AutoJs6 脚本编写技能78## 概述910AutoJs6 是基于 Android 无障碍服务的 JavaScript 自动化工具,使用 Mozilla **Rhino 引擎**(非 V8/Node.js),可直接调用 Java API。1112- **官方文档**:https://github.com/SuperMonster003/AutoJs6-Documentation13- **文档版本**:1.1.8(versionCode 39)1415---1617## 触发条件1819**以下情况必须使用此技能:**20211. 用户请求编写 AutoJs6 脚本("帮我写一个 AutoJs6 脚本来...")222. 用户询问 AutoJs6 API 用法("AutoJs6 中如何...")233. 用户需要开发指导或遇到错误244. 用户提到相关关键词:AutoJs6、autojs、auto.js、安卓自动化、控件操作、手机脚本自动点击等2526---2728## 工作流程29301. **识别需求**:判断用户需要脚本编写、API 查询还是错误排查312. **选择参考文件**:根据问题类型读取对应的参考文件(见下方说明)323. **提供准确回答**:从参考文件提取信息,提供正确的函数签名、参数、代码示例334. **验证准确性**:确保与参考文档一致,包含必要的错误处理3435---3637## 参考文件说明(按需读取)3839### 整合参考文件(快速概览)4041本技能包含三个**整合参考文件**,适合快速确认 API 用法:4243| 文件 | 内容 | 何时读取 |44|------|------|---------|45| `references/api-core.json` | 21个核心模块的所有方法签名与说明 | 需要确认任意 API 的用法、参数、返回值时 |46| `references/api-selector.json` | UiSelector(222方法) / UiObject(135方法) / UiObjectCollection(56方法) 完整API | 涉及控件选择、控件属性操作时 |47| `references/patterns-and-pitfalls.json` | 权限说明、常用代码模式、Top错误列表、调试技巧、Rhino引擎特性 | 编写整体逻辑、权限判断、排查错误时 |4849### 粒度参考文件(精确查询)5051每个模块有独立的 JSON 文件,适合精确查找特定模块的详细 API:5253| 功能领域 | 参考文件 |54|---------|---------|55| 自动化操作 | `automator.json`, `coordinates-based-automation.json`, `widgets-based-automation.json` |56| 控件选择器 | `uiSelectorType.json`, `uiObjectType.json`, `uiObjectActionsType.json`, `uiObjectCollectionType.json` |57| 应用和设备 | `app.json`, `appType.json`, `device.json`, `intent.json`, `intentType.json` |58| UI 交互 | `ui.json`, `dialogs.json`, `floaty.json`, `canvas.json`, `progress.json`, `toast.json` |59| 图像和 OCR | `image.json`, `imageWrapperType.json`, `ocr.json`, `color.json`, `colorTable.json` |60| 文件和数据 | `files.json`, `storages.json`, `storageType.json` |61| 网络和通信 | `http.json`, `web.json`, `webSocketType.json` |62| 多线程和事件 | `threads.json`, `timers.json`, `events.json`, `eventEmitterType.json` |63| 系统功能 | `shell.json`, `sensors.json`, `runtime.json`, `engines.json` |64| 工具类 | `console.json`, `crypto.json`, `util.json`, `mathx.json`, `arrayx.json`, `numberx.json` |65| 多媒体 | `media.json`, `recorder.json`, `barcode.json`, `qrcode.json` |66| 其他 | `shizuku.json`, `plugins.json`, `notice.json`, `autojs.json` |6768完整索引见 `references/index.md`6970> **规则**:回答 AutoJs6 代码问题时,**先读取对应参考文件,再输出代码**,不得依赖记忆中的 API 写法。简单查询用整合文件,深入查询用粒度文件。7172---7374## 核心模块速览7576`references/api-core.json` 包含以下模块的完整方法列表:7778| 模块 | 主要功能 | 关键方法示例 |79|------|---------|------------|80| `automator` | 触摸/手势模拟 | `click(x,y)` `swipe()` `gesture()` `input()` |81| `widgetsBasedAutomation` | 控件自动化全局函数 | `click(text)` `scrollUp()` `setText()` `auto()` |82| `app` | 应用管理、Intent | `launch()` `launchApp()` `startActivity()` `openUrl()` |83| `console` | 日志、控制台悬浮窗 | `log()` `show()` `rawInput()` `time()` |84| `device` | 设备信息与控制 | `width` `height` `getBattery()` `keepScreenOn()` |85| `image` | 截图、找色、模板匹配 | `captureScreen()` `findColor()` `findImage()` `matchTemplate()` |86| `http` | HTTP 请求 | `get()` `post()` `postJson()` `request()` |87| `files` | 文件读写 | `read()` `write()` `exists()` `listDir()` |88| `storages` | 键值持久化存储 | `create()` `.get()` `.put()` `.remove()` |89| `threads` | 多线程 | `start()` `lock()` `atomic()` `disposable()` |90| `events` | 事件监听 | `onKeyDown()` `onTouch()` `onNotification()` `onToast()` |91| `floaty` | 悬浮窗 | `window()` `rawWindow()` `closeAll()` |92| `dialogs` | 对话框 | `alert()` `confirm()` `rawInput()` `select()` |93| `global` | 全局函数 | `sleep()` `toast()` `toastLog()` `exit()` `random()` |94| `ui` | UI 界面 | `layout()` `inflate()` `run()` `post()` |95| `shell` | Shell 命令 | `shell(cmd, root)` |96| `media` | 多媒体播放 | `playMusic()` `stopMusic()` `scanFile()` |97| `sensors` | 传感器 | `register()` `unregister()` |98| `util` | 工具函数 | 字符串/数组/对象辅助方法 |99| `crypto` | 加解密 | 哈希、AES 等加密方法 |100| `base64` | Base64 编解码 | `encode()` `decode()` |101102`references/api-selector.json` 包含:103- **UiSelector**(222个方法):`text()` `id()` `className()` `findOne()` `find()` `exists()` `waitFor()` 等所有选择器104- **UiObject**(135个方法):控件属性读取、点击、输入、滚动、节点遍历等105- **UiObjectCollection**(56个方法):控件集合操作106107---108109## 权限速查110111| 功能 | 所需权限 |112|------|---------|113| selector 查找控件 / 模拟触摸 / 系统按键 | **无障碍服务** |114| `images.captureScreen()` | **截图权限**(首次弹授权框) |115| `floaty.window()` / `console.show()` | **悬浮窗权限** |116| `shell(cmd, true)` / `events.onTouch()` | **Root 权限** |117| `device.setBrightness()` | **修改系统设置权限** |118| 通知监听 `events.onNotification()` | **通知服务权限** |119120---121122## 最常用代码模板123124```javascript125// ① 脚本开头:请求无障碍服务126auto.waitFor();127128// ② 等待控件出现后点击(推荐写法)129let btn = text('确定').findOne(5000); // 加超时,不永久阻塞130if (btn) btn.click();131else console.log('未找到按钮');132133// ③ 截图找色(必须 recycle)134let img = images.captureScreen();135let pt = images.findColor(img, '#FF0000', {threshold: 10});136if (pt) click(pt.x, pt.y);137img.recycle(); // ← 必须释放138139// ④ 比例坐标(适配不同分辨率)140let W = device.width, H = device.height;141swipe(W*0.5, H*0.8, W*0.5, H*0.2, 500);142143// ⑤ 本地存储(持久化)144let s = storages.create('myApp');145s.put('count', s.get('count', 0) + 1);146147// ⑥ 多线程更新UI148threads.start(function() {149 let result = doWork();150 ui.run(() => textView.setText(result));151});152153// ⑦ UI脚本开头必须声明154'ui';155ui.layout(<vertical>...</vertical>);156```157158---159160## Top 常见错误速查161162| 症状 | 原因 | 修复 |163|------|------|------|164| 控件操作全部无效 | 未开启无障碍服务 | 开头加 `auto.waitFor()` |165| 脚本永久卡死 | `findOne()` 无超时 | 改为 `findOne(5000)` 并判断 null |166| 长时间运行后崩溃 | Image 对象未回收 | 每次截图后 `img.recycle()` |167| ui 模块方法报错 | 忘写 `'ui';` | 第一行加 `'ui';` |168| 点击位置错误 | 固定坐标不适配 | 用 `device.width/height` 计算比例 |169| 子线程操作 View 报错 | 跨线程操作 UI | 改用 `ui.run(() => {...})` |170| 悬浮窗脚本退出后残留 | 未关闭悬浮窗 | 退出前 `floaty.closeAll()` |171| dialogs 在 ui 模式卡死 | 阻塞了 UI 线程 | 用回调或 Promise 形式 |172| events 事件处理延迟 | 主线程有耗时操作 | 把耗时操作移到子线程 |173| captureScreen 每次弹框 | 未提前申请截图权限 | 脚本开头调用 `images.requestScreenCapture()` |174175完整错误列表见 `references/patterns-and-pitfalls.json` → `top_mistakes`176177---178179## 回答规范180181### 代码质量要求182- **必须** `findOne()` 加超时参数并处理 null183- **必须** 截图操作后调用 `img.recycle()`184- **必须** 无障碍脚本开头加 `auto.waitFor()`185- **必须** UI脚本第一行写 `'ui';`186- **推荐** 使用比例坐标而非固定坐标187- **推荐** 随机延迟模拟人工操作:`sleep(random(500, 1500))`188189### 回答格式1901. 简述实现思路(1-2句)1912. 提供完整可运行代码(含必要注释)1923. 说明所需权限1934. 关键注意点(不超过3条)194195---196197## Rhino 引擎说明198199AutoJs6 使用 **Mozilla Rhino**(非 V8),注意:200- 支持:`let/const` / 箭头函数 / 模板字符串 / 解构 / `Promise`(基础)201- 不支持:顶层 `await` / `WeakRef` / 部分 ES2020+ 特性202- 特有:可直接使用 Java 类 `new java.util.ArrayList()`203- 可 `importClass(java.io.File)` 导入 Java 类204205详见 `references/patterns-and-pitfalls.json` → `rhino_engine_notes`206207---208209## 注意事项2102111. **版本一致性**:参考文件基于 AutoJs6 文档 v1.1.8,API 可能随版本更新变化2122. **设备差异**:不同 Android 设备/版本可能有行为差异,建议添加设备检测逻辑2133. **错误处理**:始终提供包含错误处理的代码示例,避免空指针、超时等问题214215Relative paths (e.g., references/) are relative to this skill's directory (${CLAUDE_PLUGIN_ROOT}/skills/autojs6-doc/).