惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
爱范儿
爱范儿
博客园_首页
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
大猫的无限游戏
大猫的无限游戏
月光博客
月光博客
IT之家
IT之家
WordPress大学
WordPress大学
N
Netflix TechBlog - Medium
Microsoft Azure Blog
Microsoft Azure Blog
The GitHub Blog
The GitHub Blog
C
Check Point Blog
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - Franky
G
Google Developers Blog
V
V2EX
雷峰网
雷峰网
美团技术团队
博客园 - 【当耐特】
人人都是产品经理
人人都是产品经理
有赞技术团队
有赞技术团队
MongoDB | Blog
MongoDB | Blog
V
Visual Studio Blog
J
Java Code Geeks

Lua

用 Lua 写 Android 应用? AutoLua 做到了 使用 Android Lua Helper 在 VSCODE 中调试安卓 Lua 应用 skynet 怎么给 mysql drive 增加对 caching_sha2_password 的支持 奇怪的小问题 Lua 代码上的优化,相互学习一下 openresty + lua 这个地方怎么写 求一份 lua 入门教程 有关 Lua 调用 C++ 编译动态库程序 飞书 + Lua 实现企业级组织架构登录认证 为什么游戏架构要用事件来驱动? vscode 上写 lua 有显示注释的插件吗? lua 为什么要使用~=当作不等于运算符? 请问现在 lua 混淆用什么工具,求常年 lua 的老哥指点 lua 的前景如何? core_framework - 基于 libev 的轻量级 lua 网络开发框架 如何构建伪视频流服务? 低延时低采样, 基于 OpenResty , HTTP, 内网... TP-Link 官方使用的是开源固件? 表达过去、现在与将来:之将来(1) 有个问题, lua 平时能用来做做什么 ngx_lua 遇到的一个小坑 Lua IDE 各位 V 友,用 lua 作为开发语言用什么 IDE 可以方便代码提示以及调试呢 Lua 怎么实现 php strstr() 函数的功能 使用 Sol2 来进行 Lua 绑定 luarocks 使用上的一些小技巧 正在用 lua 写一个 nginx 防盗链的拓展,遇到了一个问题。 9k-18k 宁波 经验 3-5 年 本科及以上 全职 职位诱惑 : 年终奖 出国旅游 顶级办公设备及环境 关于 Lua 的标准库 Torch 一个在 MediaWiki 里面加入 Lua 脚本的插件 ngx_lua_reqstatus 实时监控 Nginx 域名 qps 的 lua 拓展
Android 上直接用 Lua 调 Java API 写脚本——AutoLua 技术分享
haikejishu · 2026-06-18 · via Lua

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. 怎么开始

  1. 下载 APK:https://www.autolua.top/
  2. 系统设置 → 无障碍 → AutoLua → 开启
  3. 新建工程 → 写脚本 → 跑

8. 最后

AutoLua 做的事情很简单:

把 Lua 运行时搬到 Android 上,把 Java API 桥接给你。

剩下能写出什么、用到哪里——是你的想象力决定的,不是工具决定的。

AutoLua · https://www.autolua.top/