[按键精灵安卓/ios脚本插件开发] 遍历获取LuaAuxLib函数库命令辅助工具

LuaAuxLib库
LuaAuxLib是按键精灵所有内置命令所在的库文件,有多种方式来获取LuaAuxLib库下的函数命令,例如反编译按键精灵手机端库文件等。这里咱们来介绍一种浅显易懂的方式来获取,直接for循环遍历获取函数名。

ScanLuaAuxLib
我们写一个自定义插件函数ScanLuaAuxLib来实现遍历循环LuaAuxLib内的键值对内容,因为LuaAuxLib库的本质也是一个table数据,在这个table中的键名就是我们需要的命令名。遍历代码如下:

调试运行获取所有命令名
我们来调试运行下这个插件命令,看看输出的内容都是什么。

在调试信息中,所有命令名称都被输出显示,后面类型大部分都是function,表示命令函数的意思。从这些函数名称中,可以推断出对应按键精灵的命令,例如UI_AddButton就是对应UI.AddButton()命令,SetAutoLockTime对应的是Device.SetAutoLockTime()等,绝大多数都是有迹可循的。至于参数跟返回值,大部分也都是与按键精灵命令保持一致,具体还请大家自行测试。这里提下比较特殊的几个含返回参数的命令,一般返回参数是作为多个返回值实现的,例如找图命令LuaAuxLib.FindPicture(),它有8个参数,与按键精灵前8个保持一致,但是返回坐标参数被放到了返回值中,它有3个返回值,分别是返回X坐标,返回Y坐标,返回图片序号。由于篇幅有限,这里就不对每一个命令一一进行讲解了,还请大家自行测试摸索。

附:完整代码

复制代码
local _zimao = {} --这是内部私有table函数
local zimao = {} --这是对外公开table函数
QMPlugin = zimao --通过这行代码, 实现将zimao表中所有函数对外公开

_zimao.version = "20220306" --插件版本号, 方便自己记忆

local function try(block) -- 保护执行函数
local tablejoin = function (...)
local result = {}
for _, t in ipairs({...}) do
if type(t) == "table" then
for k, v in pairs(t) do
if type(k) == "number" then table.insert(result, v)
else result[k] = v end
end
else
table.insert(result, t)
end
end
return result
end

-- get the try function
local try = block[1]
assert(try)

-- get catch and finally functions
local funcs = tablejoin(block[2] or {}, block[3] or {})

-- try to call it
local result_error = {}
local results = {pcall(try)}
if not results[1] then
-- run the catch function
if funcs and funcs.catch then
result_error = {funcs.catch(results[2])}
end
end

-- run the finally function
if funcs and funcs.finally then
local result_fin = {funcs.finally(table.unpack(results))}
if #result_fin > 0 then
return table.unpack(result_fin)
end
end

-- ok?
if results[1] and #results > 1 then
return table.unpack(results, 2, #results)
else
if #result_error > 0 then
return table.unpack(result_error)
else
return nil
end
end
end
local function catch(block) --异常捕获函数
return {catch = block[1]}
end
local function finally(block) --最终必定执行函数
return {finally = block[1]}
end

-- 常用的内部函数, 不加入私有table中, 直接定义使用
local function traceprint(...) --调用按键精灵的调试输出命令
if QMPlugin then -- 在Lua调试环境下, QMPlugin变量的值是我们插件公开table函数值, 而在按键精灵调试运行环境下, 该变量值被替换为nil
print(...)
else
-- 获取可变长参数的第一个参数值
local line = select(1, ...)
-- 如果第一个参数是字符串, 并且符合格式 _数字 , 则判定为行号意思
if type(line) == "string" and line:match("^%_%d+$") then
-- 第一个参数按照格式 _数字: 传入TracePrint中可实现打印行号功能
LuaAuxLib.TracePrint(line .. ":", table.concat({...}, " ", 2, select("#", ...)))
elseif line == ":" and #{...} > 1 then
-- 第一个参数是冒号 : 时, 表示直接打印输出数据
LuaAuxLib.TracePrint(":", table.concat({...}, " ", 2, select("#", ...)))
else
-- 其他的情况下则加上前缀后, 进行正常输出
LuaAuxLib.TracePrint(":","紫猫学院测试插件:", ...)
end
end
end

-- 实现获取变量信息的插件函数, 需对外公开, 所以使用zimao前缀
function zimao.VarInfo(...)
-- 防止无法获取nil参数
local paramCount = select("#", ...)
local varType, printStr, t = "", "", {}
for i = 1, paramCount do
local v = select(i, ...)
try {
function()
varType = type(v)
if varType == "table" then
printStr = "【" .. varType .." " .. tostring(#v) .. "】" .. LuaAuxLib.Encode_GetJsonLib():encode(v)
elseif varType == "number" or varType == "string" then
printStr = "【" .. varType .." " .. tostring(#tostring(v)) .. "】" .. tostring(v)
elseif varType == "boolean" or varType == "null" then
printStr = "【" .. varType .."】" .. tostring(v)
else
printStr = "【" .. varType .."】 未知数据,无法查看!"
end
table.insert( t, #t + 1, printStr )
end,
catch {
function (errors)
-- 下面这个traceprint是我们上面定义过的内部输出命令,注意大小写
traceprint("发生运行时错误!错误代码:VarInfo(),错误信息:", errors)
end
}
}
end
printStr = table.concat( t, ", " )
return printStr
end

-- 实现打印输出变量详细信息数据, 需对外公开
function zimao.TracePrint(...)
-- 通过VarInfo函数获取参数的详细数据信息
local info = zimao.VarInfo(...)
try {
function()
-- 在保护模式下打印输出这个数据内容
traceprint(info)
end,
catch {
function (errors)
traceprint("发生运行时错误!错误代码:TracePrint(),错误信息:", errors)
end
}
}
end

function zimao.ScanLuaAuxLib()
-- 以保护模式运行, 避免插件错误造成脚本终止
try {
function()
-- 遍历LuaAuxLib内的内容
for k, v in pairs(LuaAuxLib) do
-- 使用自定义函数traceprint在按键精灵中打印函数名
traceprint("名称: " .. k, "类型: " .. type(v))
end
end,
catch {
function (errors)
traceprint("发生运行时错误!错误代码:ScanLuaAuxLib(),错误信息:", errors)
end
}
}
end
相关推荐
inmK12 小时前
蓝奏云官方版不好用?蓝云最后一版实测:轻量化 + 不限速(避更新坑) 蓝云、蓝奏云第三方安卓版、蓝云最后一版、蓝奏云无广告管理工具、安卓网盘轻量化 APP
android·工具·网盘工具
giaoho2 小时前
Android 热点开发的相关api总结
android
咖啡の猫4 小时前
Android开发-常用布局
android·gitee
程序员老刘4 小时前
Google突然“变脸“,2026年要给全球开发者上“紧箍咒“?
android·flutter·客户端
Tans54 小时前
Androidx Lifecycle 源码阅读笔记
android·android jetpack·源码阅读
雨白5 小时前
实现双向滑动的 ScalableImageView(下)
android
峥嵘life5 小时前
Android Studio新版本编译release版本apk实现
android·ide·android studio
studyForMokey7 小时前
【Android 消息机制】Handler
android
敲代码的鱼哇7 小时前
跳转原生系统设置插件 支持安卓/iOS/鸿蒙UTS组件
android·ios·harmonyos
翻滚丷大头鱼7 小时前
android View详解—动画
android