使用文档

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 参考