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

推荐订阅源

大猫的无限游戏
大猫的无限游戏
aimingoo的专栏
aimingoo的专栏
I
InfoQ
B
Blog RSS Feed
D
DataBreaches.Net
S
SegmentFault 最新的问题
P
Proofpoint News Feed
A
About on SuperTechFans
WordPress大学
WordPress大学
Hugging Face - Blog
Hugging Face - Blog
博客园 - 司徒正美
小众软件
小众软件
博客园 - Franky
有赞技术团队
有赞技术团队
D
Docker
T
Tailwind CSS Blog
雷峰网
雷峰网
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Blog — PlanetScale
Blog — PlanetScale
酷 壳 – CoolShell
酷 壳 – CoolShell
B
Blog
V
Visual Studio Blog
宝玉的分享
宝玉的分享
爱范儿
爱范儿

V2EX

我用 AI 写代码,但终端管理反而成了累赘——于是我做了 codux [调研] 各位在公司都用什么 ide 和 agent 写代码? 老运维 share 一个运维平台 看到有公司考核 token 指标,很好奇大家上个月的 AI 账单是多少 GLM-Coding 调用持续报错: z.ai 的 Lite 套餐几乎无法使用,官方 Pro/Max 是否稳定? 现在还有什么渠道可以稳定安全地使用 Claude 吗? 上海漕河泾内推,本组有 2 个 hc,一个后端,一个前端,预算都是 20k 左右,不打卡,氛围好 如果 V2EX 上有一组不永久保存聊天记录(比如只保存 7 天或者 24 小时)的聊天室,那么会开启哪些有用或者有趣的可能? gemini cli 貌似挂了,一直返回 403 第一次在自媒体上赚到钱 收集了最近在使用的低价 GPT, Gemini,邮箱等 AI 会员的小店合集 讨论个大实话:现在企业还在说 AI 编程提效 20%, 30%的,真的太落后,没用懂 AI。因为包括很多前沿公司,已经狂奔到提效 200%-500%的情况 [招聘][远程][币安] 前端/后端/QA/iOS/Android 至少 3 年以上经验 目前有大量 HC 欢迎投递 Chatgpt Pro 用量用不完的可以开这些设置 面试的时候好像遇到钓鱼了,给各位避个坑 cursor 年续费 22 号到期, 自动续费是否还是老的计次套餐呢 被两件破事毁掉的一下午,琐碎的内耗消磨人的精力 使用 Planet 存储 Codex 的会话或者重要信息 如果业务部门领导不要你开发功能,而是要求你教会它用 claude code 开发功能,你会怎么做? 分享一个 MacOS 接绿联 CM818 USB 转 DP 转接器使用感受 我的 HR 朋友 10 年老 Java ,非全大专,大家帮忙看看简历 开源了一个 AI 口语练习工具,音素级发音评分,完全免费可自部署 V2EX 上有哪些你觉得很有趣、印象深刻的妹纸? 字节为啥不出个国内版 Vercel? 有在大马的朋友吗? 问个运营商问题 你们在有领导的公司大群发过的最大胆的消息是什么 公司裁员,目前没有工作。想试试摆摊,做一个移动鲜啤打酒车 我的硬盘 Memblaze Pblaze 5 Linux 下不识别,给 Linux 内核提交了补丁, AI 说有望被合并 只有我一个人觉得 codex 不好用?
Android 上直接用 Lua 调 Java API 写脚本——AutoLua 技术分享
haikejishu · 2026-06-18 · via V2EX

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/