AutoGo 的脚本引擎扩展方案,为 AutoGo 提供 JavaScript 和 Lua 脚本语言支持,让开发者可以用熟悉的脚本语言编写自动化任务。
- 降低准入门槛 - 使用脚本语言开发,无需深入理解 Go 语言和 Android 开发,降低学习成本
- 代码保护 - 脚本代码易于混淆加密,有效保护业务逻辑
- 热更新支持 - 脚本可动态加载,无需重新编译即可更新功能
- 双引擎支持:同时支持 JavaScript 和 Lua 脚本语言
- 丰富的 API:提供应用管理、设备控制、图像识别、OCR 等多种功能
- 方法注册系统:支持动态注册、重写和恢复方法
- 协程支持:Lua 引擎支持协程操作
- 文档生成:可自动生成 API 文档
| 模块 | 说明 |
|---|---|
app |
应用管理(启动、安装、卸载、强制停止等) |
device |
设备信息(分辨率、SDK 版本、屏幕方向等) |
motion |
触摸操作(点击、滑动、手势等) |
files |
文件操作(读写、复制、删除等) |
images |
图像处理(截图、找色、找图等) |
storages |
数据存储(键值对存储) |
system |
系统功能(剪贴板、通知等) |
http |
网络请求(GET、POST 等) |
media |
媒体控制(音量、播放等) |
opencv |
计算机视觉(图像处理、特征检测等) |
ppocr |
OCR 文字识别 |
console |
控制台窗口(显示、隐藏、日志输出等) |
dotocr |
点字 OCR 识别(基于字库的 OCR) |
hud |
HUD 悬浮显示(脚本状态显示等) |
ime |
输入法控制(剪切板、文本输入等) |
plugin |
插件加载(加载外部 APK 调用 Java 方法) |
rhino |
JavaScript 执行引擎(Rhino) |
uiacc |
无障碍 UI 操作(控件查找、点击、输入等) |
utils |
工具方法(日志、Toast、类型转换等) |
vdisplay |
虚拟显示(虚拟屏操作) |
yolo |
YOLO 目标检测(v5/v8 模型) |
imgui |
Dear ImGui GUI 库(窗口、按钮、输入框等控件) |
- Go 1.25.4 或更高版本
- AutoGo 框架(已在项目中集成)
- Android 设备(用于实际运行自动化脚本)
go get github.com/ZingYao/autogo_scriptengine@v0.0.5🔥 重要提示:查看以下详细文档以获取完整的 API 参考和使用指南
- JavaScript 引擎完整文档 - 包含所有 API、配置选项和高级用法
- JavaScript 模块文档 - 各个功能模块的详细说明
- Lua 引擎完整文档 - 包含所有 API、配置选项和高级用法
- Lua 模块文档 - 各个功能模块的详细说明
本项目中许多函数都支持 displayId 参数,用于指定操作的显示器 ID:
- displayId = 0:默认显示器(主屏幕)
- displayId = 1:第二个显示器(如副屏)
- displayId = 2:第三个显示器
- 以此类推...
注意:大多数情况下使用 displayId = 0 即可。如果你的设备只有一个屏幕,所有操作都应该使用 0。
package main
import (
"fmt"
js_engine "github.com/ZingYao/autogo_scriptengine/js_engine"
)
func main() {
// 获取 JavaScript 引擎实例
engine := js_engine.GetEngine()
defer js_engine.Close()
// 执行 JavaScript 脚本
script := `
// 获取当前应用包名
var packageName = app.currentPackage();
console.log("当前应用: " + packageName);
// 获取设备信息
console.log("设备分辨率: " + device.width + "x" + device.height);
// 点击屏幕(参数:x, y, fingerID, displayId)
click(500, 1000, 1, 0);
// 延时
sleep(1000);
`
err := engine.ExecuteString(script)
if err != nil {
fmt.Printf("执行错误: %v\n", err)
}
}package main
import (
"fmt"
lua_engine "github.com/ZingYao/autogo_scriptengine/lua_engine"
)
func main() {
// 获取 Lua 引擎实例
engine := lua_engine.GetEngine()
defer lua_engine.Close()
// 执行 Lua 脚本
script := `
-- 获取当前应用包名
local packageName = app_currentPackage()
print("当前应用: " .. packageName)
-- 获取设备信息
print("设备分辨率: " .. device.width .. "x" .. device.height)
-- 点击屏幕(参数:x, y, fingerID, displayId)
click(500, 1000, 1, 0)
-- 延时
sleep(1000)
`
err := engine.ExecuteString(script)
if err != nil {
fmt.Printf("执行错误: %v\n", err)
}
}engine := js_engine.GetEngine()
defer js_engine.Close()
// 执行脚本文件
err := engine.ExecuteFile("/path/to/script.js")
if err != nil {
fmt.Printf("执行错误: %v\n", err)
}engine := lua_engine.GetEngine()
defer lua_engine.Close()
// 执行脚本文件
err := engine.ExecuteFile("/path/to/script.lua")
if err != nil {
fmt.Printf("执行错误: %v\n", err)
}engine := js_engine.GetEngine()
// 注册自定义方法
engine.RegisterMethod("myMethod", "我的自定义方法", func(param string) string {
return "处理结果: " + param
}, true)-- 重写 click 方法,添加日志
local originalClick = click
function click(x, y, fingerID)
print("点击坐标: (" .. x .. ", " .. y .. ")")
originalClick(x, y, fingerID)
end-- 创建协程
local coId = createCoroutine([[
print("协程开始")
yieldCoroutine(1)
print("协程继续")
]])
-- 恢复协程执行
local results, status = resumeCoroutine(coId)
print("协程状态: " .. status)// JavaScript
app.launch("com.example.app", 0); // 启动应用(第二个参数为 displayId)
app.forceStop("com.example.app"); // 强制停止
app.isInstalled("com.example.app"); // 检查是否安装
app.uninstall("com.example.app"); // 卸载应用-- Lua
app_launch("com.example.app", 0) -- 启动应用(第二个参数为 displayId)
app_forceStop("com.example.app") -- 强制停止
app_isInstalled("com.example.app") -- 检查是否安装
app_uninstall("com.example.app") -- 卸载应用// JavaScript - 找色
var result = images.findColor(0, 0, 1080, 1920, "#FF0000", 0.9, 0, 0);
if (result.x !== -1) {
click(result.x, result.y, 1, 0);
}
// OCR 文字识别
var text = ppocr.ocr(0, 0, 1080, 1920, "");
console.log(text);-- Lua - 找色
local x, y = images_findColor(0, 0, 1080, 1920, "#FF0000", 0.9, 0, 0)
if x ~= -1 then
click(x, y, 1, 0)
end
-- OCR 文字识别
local results = ppocr_ocr(0, 0, 1080, 1920, "")
for i, result in ipairs(results) do
print(result["标签"])
end// JavaScript - 控件查找与点击
var ui = uiacc.new(0);
ui.text("登录").click("登录");
var obj = ui.text("按钮").waitFor(5000);
if (obj) {
obj.click();
}-- Lua - 控件查找与点击
local ui = uiacc_new(0)
uiacc_text(ui, "登录")
uiacc_click(ui, "登录")
local obj = uiacc_waitFor(ui, 5000)
if obj then
uiobj_click(obj)
end// JavaScript - YOLO 检测
var y = yolo.new("v8", 4, "/sdcard/model.param", "/sdcard/model.bin", "/sdcard/labels.txt");
var results = y.detect(0, 0, 1080, 1920, 0);
for (var i = 0; i < results.length; i++) {
console.log(results[i].标签 + " at (" + results[i].X + ", " + results[i].Y + ")");
}
y.close();-- Lua - YOLO 检测
local y = yolo_new("v8", 4, "/sdcard/model.param", "/sdcard/model.bin", "/sdcard/labels.txt")
local results = yolo_detect(y, 0, 0, 1080, 1920, 0)
for i, r in ipairs(results) do
print(r["标签"] .. " at (" .. r["X"] .. ", " .. r["Y"] .. ")")
end
yolo_close(y)-- Lua
files_write("/sdcard/test.txt", "Hello World") -- 写入文件
local content = files_read("/sdcard/test.txt") -- 读取文件
files_exists("/sdcard/test.txt") -- 检查是否存在-- Lua
storages_put("myData", "key1", "value1") -- 存储数据
local value = storages_get("myData", "key1") -- 获取数据
storages_contains("myData", "key1") -- 检查键是否存在-- Lua
utils_toast("提示信息") -- 显示 Toast
utils_shell("ls /sdcard") -- 执行 Shell 命令
local n = utils_random(1, 100) -- 随机数
utils_sleep(1000) -- 延时 1 秒项目提供了自动生成 API 文档的功能:
// JavaScript 引擎文档生成
docGen := js_engine.NewDocumentationGenerator()
docGen.SaveJSDocumentation("js_api.js")
docGen.SaveMarkdownDocumentation("js_api.md")
// Lua 引擎文档生成
docGen := lua_engine.NewDocumentationGenerator()
docGen.SaveLuaDocumentation("lua_api.lua")
docGen.SaveMarkdownDocumentation("lua_api.md")autogo_scriptengine/
├── go.mod
├── go.sum
├── js_engine/ # JavaScript 引擎
│ ├── js_engine.go # 引擎核心
│ ├── app_inject.go # 应用管理 API
│ ├── device_inject.go # 设备信息 API
│ ├── motion_inject.go # 触摸操作 API
│ ├── files_inject.go # 文件操作 API
│ ├── images_inject.go # 图像处理 API
│ ├── storages_inject.go # 数据存储 API
│ ├── system_inject.go # 系统功能 API
│ ├── https_inject.go # 网络请求 API
│ ├── media_inject.go # 媒体控制 API
│ ├── opencv_inject.go # OpenCV API
│ ├── ppocr_inject.go # OCR API
│ ├── console_inject.go # 控制台 API
│ ├── dotocr_inject.go # 点字OCR API
│ ├── hud_inject.go # HUD API
│ ├── ime_inject.go # 输入法 API
│ ├── plugin_inject.go # 插件加载 API
│ ├── rhino_inject.go # Rhino JS API
│ ├── uiacc_inject.go # 无障碍UI API
│ ├── utils_inject.go # 工具方法 API
│ ├── vdisplay_inject.go # 虚拟显示 API
│ ├── yolo_inject.go # YOLO检测 API
│ └── ...
└── lua_engine/ # Lua 引擎
├── lua_engine.go # 引擎核心
├── coroutine.go # 协程支持
├── app_inject.go # 应用管理 API
├── device_inject.go # 设备信息 API
├── motion_inject.go # 触摸操作 API
└── ...
- AutoGo - Android 自动化框架(核心依赖)
- goja - JavaScript 解释器
- gopher-lua - Lua 解释器
本项目是 AutoGo 的扩展方案,通过封装 AutoGo 提供的原生 API,为开发者提供更灵活的脚本编写方式:
- AutoGo - 提供 Android 自动化的核心能力(无障碍服务、图像识别、触摸模拟等)
- ScriptEngine - 为 AutoGo 添加脚本语言支持,让开发者可以用 JavaScript 或 Lua 编写自动化脚本
MIT License