haikejishu
V2EX  ›  Lua

Android 上直接用 Lua 调 Java API 写脚本——AutoLua 技术分享

  •  
  •   haikejishu · 23h 8m ago · 1000 views

    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/

    13 replies    2026-06-19 13:12:09 +08:00
    idonttellyou
        1
    idonttellyou  
       22h 49m ago
    收藏
    kneo
        2
    kneo  
       20h 27m ago
    一看就是 GPT 写的,满满的豆包味儿。
    liyafe1997
        3
    liyafe1997  
       20h 25m ago
    这个有点意思,不过感觉拿 Python 来 Bridge 是不是更好,毕竟 Python 生态更广泛。这样做好多 Android Native 的实验都不需要扯上 Android Studio 去编译 apk 了。
    sduoduo233
        4
    sduoduo233  
       19h 56m ago via Android
    看着怎么这么熟悉 这和 androlua+有啥关系
    cwxiaos
        5
    cwxiaos  
       17h 19m ago via iPhone
    我记得 autojs6 还是 x 有这功能吧,以前写脚本还用过,new Intent ,去调隐藏的 activity
    v1
        6
    v1  
       11h 1m ago
    我都有 root 了直接起脚本了,然后没 root 的话你这个无障碍在高版本安卓其实很鸡肋
    haikejishu
        7
    haikejishu  
    OP
       9h 25m ago
    @sduoduo233 看来是老玩家,借鉴了 androlua+,新增了自动化脚本这块
    haikejishu
        8
    haikejishu  
    OP
       9h 23m ago
    @v1 有 root 就不用无障碍了,但是没 root 的情况也得考虑,万一需要呢,多兼容点总是好事。
    haikejishu
        9
    haikejishu  
    OP
       9h 12m ago
    @liyafe1997 Python 生态确实香,但选 Lua 不是拍脑袋——三个硬理由:
    1. 运行时体积。Lua 5.3 解释器 ~200KB 。Python 解释器再怎么裁也要几十 MB 。一个 APK 塞进 Python 运行时,基础包就直接上
    30MB+,对安卓脚本工具来说太重了。
    2. 嵌入友好度。Lua 从设计第一天就是给 C/C++ 当嵌入式脚本引擎用的,JNI 桥接非常薄。Python 的嵌入要处理 GIL 、JNI
    线程模型、引用计数 GC 和 Android 生命周期的配合,复杂度不是一个量级。
    3. 启动速度。AutoLua 目标是用脚本替代"手机上重复点来点去"的操作——用户打开 App 、点脚本、跑。Lua
    解释器初始化几乎无感。Python 的冷启动延迟在移动端是硬伤。
    haikejishu
        10
    haikejishu  
    OP
       9h 8m ago
    @kneo 内容是我写的,让 AI 润了下色。可能润过头了哈哈。
    不过代码和 API 真不骗人——Tap()、FindMultiColor()、luajava.bindClass() 这些都是从项目里扒的,下一个 APK 翻源码就能对上。
    官网有联系群,进来验货也行,聊脚本也行。
    haikejishu
        11
    haikejishu  
    OP
       9h 2m ago
    @cwxiaos 对,Auto.js 也能这么玩。只是底层不太一样——那边 Rhino 桥 JS ,这边 LuaJava 桥 Lua 5.3 ,桥接更薄,运行时更轻。
    你用过 Auto.js 的话上手更快,有兴趣进官网联系加群聊聊?
    v1
        12
    v1  
       7h 41m ago
    @haikejishu #8 我的意思是安卓 13+没法用,root 下不需要你这个中间桥
    haikejishu
        13
    haikejishu  
    OP
       4h 56m ago
    @v1 root 下封装了专用的 Api 给 Lua 调用,更方便,另外无障碍确实限制越来越多,这个是生态,没法解决,属于过渡期功能。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2515 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 81ms · UTC 10:08 · PVG 18:08 · LAX 03:08 · JFK 06:08
    ♥ Do have faith in what you're doing.