使用文档
AutoJS · Rhino 语法指南
智流脚本运行在 Rhino JavaScript 引擎上(与 AutoJS / AutoJs6 同系)。本文说明 Rhino 支持的语法、与浏览器 JS 的差异,以及自动化场景里常用的写法。
综述
Rhino 是运行在 JVM / Android 上的 JavaScript 引擎。在 AutoJS 生态中,你用 JavaScript 编写自动化脚本,引擎负责执行,并通过桥接调用 Android / Java API(点击、控件查找、截图等)。
- 脚本语言:JavaScript
- 脚本引擎:Rhino
- 语言特性:ES5 基本完整;ES6 及更新特性为部分支持
提示:写脚本前先确认当前引擎版本与文档范围。部分新语法需要较新的
Rhino / AutoJs6 构建才可用。
引擎与版本
不同发行版的 Rhino 版本不同。较新的 AutoJs6 会升级 Rhino,并逐步补齐
class、async/await 等语法。智流侧以当前内置引擎为准:遇到语法报错时,优先改写为更保守的 ES5 / 已验证 ES6 写法。
建议策略
- 业务逻辑优先使用
var/let、function、对象字面量、数组方法 - 模板字符串、箭头函数、解构等可先小范围试跑再推广
- 不要假设存在浏览器 DOM(无
document/window)
ES5 基础(推荐默认写法)
Rhino 对 ES5 支持较完整,下列写法通常最稳妥:
var name = "zhflow";
var list = [1, 2, 3];
function sum(a, b) {
return a + b;
}
var user = {
id: 1,
greet: function () {
return "hi " + this.id;
}
};
list.forEach(function (n) {
console.log(n);
});
ES6 及更新能力(部分支持)
下列特性在较新的 Rhino / AutoJs6 中常见可用(仍建议在真机脚本里验证)。示例改写自 AutoJs6 文档中的 Rhino 说明。
模板字符串
var n = (Math.random() * 100).toFixed(0);
toast("Lucky number: " + n);
// 新引擎也可尝试:`Lucky number: ${n}`
箭头函数与简写属性
var a = 7, b = 4;
var o = { a: a, b: b };
// 新引擎:let o = { a, b };
var doubled = [1, 2, 3].map(function (x) { return x * 2; });
// 新引擎:.map(x => x * 2)
数组与对象工具
Array.from("123"); // ["1","2","3"]
Array.of("hello", "world"); // ["hello","world"]
[10, 20, NaN].includes(20); // true
Object.values({ name: "Max", age: 4 });
Object.entries({ a: 1, b: 2 });
Map / Set
var m = new Map();
m.set("n", 2).set("n", 6);
m.get("n"); // 6
var s = new Set([1, 1, 2]);
s.has(1); // true
求幂与填充
9 ** 2 === 81; // true(需引擎支持)
Array(4).fill("x"); // ["x","x","x","x"]
字符串补齐
var pad = function (o) { return o.padStart(2, "0"); };
pad("9") + ":" + pad("30") + ":" + pad("7"); // "09:30:07"
与浏览器 JavaScript 的差异
- 没有网页 DOM:不能使用
document.querySelector操作手机界面 - 界面操作走 AutoJS API:如
click、text()、id()、swipe - 可与 Java 类互操作:通过
importClass/Packages访问 Android API - 模块系统与 npm 生态不同:默认不是 Node.js;不要直接
require('fs')当作 Node 用 - 异步模型:传统脚本多用同步等待(
sleep/findOne);新引擎可能支持 Promise / async,但仍需验证
对照记忆:浏览器 JS 操作网页节点;Rhino + AutoJS 操作 Android
控件树 / 坐标 / 图像。
与 Java / Android 互操作
Rhino 可以直接使用 Java 类型(权限与运行环境允许时):
importClass(android.content.Context);
// 或通过应用提供的封装 API 访问系统能力(推荐优先用封装)
toast("互操作请优先走官方模块,避免过度依赖私有类路径");
实务建议:能用 AutoJS 封装模块(app / device / files / images / automator)就不要直接摸底层 Java,可移植性更好。
AutoJS 常用写法
启动与基础交互
auto.waitFor(); // 等待无障碍就绪(如环境需要)
launchApp("设置");
sleep(1000);
toast("已启动");
控件查找与点击
var btn = text("确定").findOne(5000);
if (btn) {
btn.click();
} else {
console.log("超时未找到");
}
坐标与手势
click(500, 1200);
swipe(500, 1600, 500, 400, 500);
sleep(300);
截图与找色
if (!requestScreenCapture()) {
toast("未获得截图权限");
exit();
}
var img = captureScreen();
var p = findColor(img, "#FF0000");
if (p) click(p.x, p.y);
示例:签到类流程骨架
auto.waitFor();
function ensureApp() {
launchApp("目标应用");
sleep(1500);
}
function tapByText(label) {
var node = text(label).findOne(3000);
if (!node) throw new Error("missing: " + label);
node.click();
sleep(800);
}
try {
ensureApp();
tapByText("我的");
tapByText("签到");
toast("签到流程完成");
} catch (e) {
console.error(e);
toast("失败: " + e);
}
常见坑
- 语法超前:用了引擎尚未支持的可选链
?.、空值合并等,直接语法错误 - 把浏览器习惯带过来:查找 DOM、依赖
fetch全局可用等 - 不等待:界面未加载完就点击,应使用
findOne(timeout)或显式sleep - 权限缺失:无障碍、截图、后台运行权限未授予导致 API 静默失败
- 分辨率硬编码:纯坐标脚本换机易失效,优先控件选择器
参考资料(内容经改写整理,非原文照搬):
AutoJs6 文档
·
AutoJs6 RHINO.md
· Mozilla Rhino / MDN JavaScript 参考