1. 背景
安卓自动化工具不少,但它们有一个共同问题:脚本能力受限于工具给你封装了什么。
按键精灵给你录屏回放,你就只能录屏回放。Tasker 给你可视化规则,你就只能在规则里打转。
想调个系统 API ?想操作文件?想写个自定义 UI ?——等官方更新,等社区插件,或者干脆做不了。
AutoLua 的思路相反:不给你封装功能,给你一个完整 Lua 运行时,然后把 Android API 全部桥接给你。你能用 Java 做什么,就能用 Lua 做什么。
2. 技术栈
┌─────────────────────────────────┐
│ Lua 脚本层 │
│ ScriptApi / luajava.bindClass │
├─────────────────────────────────┤
│ Lua 5.3 运行时 │
│ (完整版,非沙箱阉割) │
├─────────────────────────────────┤
│ LuaJava JNI 桥接层 │
│ Lua ↔ Java 对象双向映射 │
│ 同进程直接调用,零序列化开销 │
├─────────────────────────────────┤
│ Android 层 │
│ ┌────────────┬───────────────┐ │
│ │ 无障碍服务 │ Root Shell │ │
│ │ (免 Root) │ │ │
│ └────────────┴───────────────┘ │
└─────────────────────────────────┘
核心是 LuaJava——让 Lua 能 new Java 对象、调 Java 方法、读 Java 字段。不是 IPC ,不是 WebSocket ,同一进程内直接桥接,零序列化开销。
3. 脚本 API
启动时引入 ScriptApi ,Install2Global 把函数注入全局命名空间:
require("ScriptApi").Install2Global()
3.1 触控
-- 点击、滑动、长按
Tap(540, 2200)
Swipe(100, 800, 100, 400, 500) -- 起点 → 终点,时长 ms
Touch(540, 2200, 2000) -- 长按 2 秒
-- 多点触控
TouchDown(540, 2200, 0) -- 触点 0 按下
TouchMove(600, 2300, 0, 100) -- 触点 0 移动
TouchUp(0) -- 触点 0 抬起
-- 按键 & 输入
KeyPress("BACK")
InputText("Hello AutoLua")
3.2 图色
-- 单点比色
if CmpColor(540, 2200, "#FF0000", 0.95) then
Tap(540, 2200)
end
-- 区域内找色,返回匹配坐标
local ret, x, y = FindColor(0, 0, 1080, 2400, "#FF0000", 0, 0.95)
if ret >= 0 then Tap(x, y) end
-- 多点找色(主色 + 偏移点数组)
local x, y = FindMultiColor(0, 0, 1080, 2400, "#FF0000",
"10|20|#00FF00,-5|30|#0000FF", 0, 0.9)
3.3 截图 & 应用管理
SnapShot("/sdcard/screen.png") -- 全屏截图
Capture(100, 100, 500, 500, "/sdcard/crop.png") -- 区域截图
RunApp("com.tencent.mm") -- 启动应用
KillApp("com.tencent.mm") -- 强制停止
底层细节:屏幕缩放一行 SetScreenScale 搞定,横屏自动转换坐标,KeepCapture / ReleaseCapture 缓存截图避免重复开销。ScriptApi 把这些全做了,表层 API 保持简洁。
4. 核心差异:桥接,不封装
这是 AutoLua 和同类工具最本质的区别。
| 别人的思路 | AutoLua 的思路 | |
|---|---|---|
| 扩展方式 | 等官方更新、找社区插件 | luajava.bindClass() 直接用 |
| 能力边界 | 工具提供了什么就用什么 | Android 能做什么就能做什么 |
| 语言 | 类 Basic / 阉割版 Lua / JS 子集 | 完整 Lua 5.3 运行时 |
| 技能迁移 | 离了这个工具就没用 | 通用 Lua 技能,写游戏写后端都能用 |
-- 需要什么,直接 import 什么
Intent = luajava.bindClass("android.content.Intent") -- 系统分享、跳转
File = luajava.bindClass("java.io.File") -- 文件操作
Bitmap = luajava.bindClass("android.graphics.Bitmap") -- 图片处理
Settings = luajava.bindClass("android.provider.Settings") -- 系统设置
不需要等人更新。Lua 5.3 完整特性——闭包、协程、元表、多返回值——全部可用。学的 Lua 以后写 Redis 脚本、Nginx 模块、游戏逻辑都能用,不白学。
5. 代码画 UI
不是拖控件,不是选模板。UI 完全用代码描述,自由度等同原生开发。
-- 创建线性布局
layout = luajava.newInstance("android.widget.LinearLayout", activity)
layout.setOrientation(1) -- 1 = VERTICAL
-- 创建按钮
btn = luajava.newInstance("android.widget.Button", activity)
btn.setText("点击我")
-- 设置点击监听
listener = luajava.createProxy("android.view.View$OnClickListener", {
onClick = function(v)
Toast.makeText(activity, "Hello", 0).show()
end
})
btn.setOnClickListener(listener)
-- 组装
layout.addView(btn)
activity.setContentView(layout)
按钮圆角、弹窗透明度、控件间距——你写什么就是什么。没有可视化工具的限制,没有模板的约束。
6. 运行与工程
双模式运行:
| 模式 | 原理 | 适用场景 |
|---|---|---|
| 无障碍服务 | AccessibilityService 触控注入 | 免 Root ,兼容 5.0–13 |
| Root 模式 | 直接执行 shell 命令 | 权限更高,延迟更低 |
工程化支持:
.alp压缩工程格式,创建、导入、导出、分享- 内置编辑器 Lua 语法高亮
- 浮窗控制面板,运行状态可视化,随时暂停/停止
- 异步执行,长任务不卡主线程
- AES / RSA / MD5 / Base64 加解密全内置
- HTTP 网络请求 + JSON 解析( OkHttp + Retrofit + Gson )
7. 怎么开始
- 下载 APK:https://www.autolua.top/
- 系统设置 → 无障碍 → AutoLua → 开启
- 新建工程 → 写脚本 → 跑
8. 最后
AutoLua 做的事情很简单:
把 Lua 运行时搬到 Android 上,把 Java API 桥接给你。
剩下能写出什么、用到哪里——是你的想象力决定的,不是工具决定的。
AutoLua · https://www.autolua.top/