关于AGG

时隔多年,GG(GameGuardian)终于迎来更新,为B站大佬不启天惊更新,是在GG 96版本的基础上二改,原GG开发者Enby已经很久没有更新了,估计以后很长一段时间也不会再更新了。AGG更新了许多好用又实用的功能,比如新增了GG函数库,支持多线程,具体可以去AGG查看更新日志。

feature:当前(24.7.10)还不支持运行编译后的lua脚本,只支持源码允许,或者lua转dex运行。

以下是AGG函数库,在AGG的界面也会有介绍用法:

AGG函数库

mainTabs

参数1:字符串,栏名

参数2:为view视图

参数3:布尔,true为锁定栏

参数4:mainTabs,多个栏加入到一个窗口

 local view = gg.viewText ( '112233' )
 local window = gg.mainTabs( 'tab栏1' , view , false )
 local view = gg.viewText ( '223344' )
 gg.mainTabs( 'tab栏2' , view , false , window )
 local view = gg.viewText ( '334455' )
 gg.mainTabs( 'tab栏3' , view , true , window )
 ​

以上运行效果为:

viewList

 -- main必须,title,subtitle 必须
 function mainAP(Table, func, tabTitle)
     -- 菜单封装
     local list = { }
     for(k, v in pairs(Table)) {
         table.insert(list , { title = v[1] , subTitle = v[2] , main = function()
                     v[3](v[4], v[5])
                 end
             })
     }
     local list = gg.viewList(list , func)
     return gg.mainTabs(tabTitle , list.getView() , false , window)
 end
 function flushed()
     gg.toast("下拉刷新")
 end
 function onclick(i)
     gg.toast("点击了菜单"..i)
 end
 window = mainAP({
         { "菜单1" , "菜单副标题1" , function()
                 gg.toast("点击了菜单1")
             end
         } ,
         { "菜单2" , "菜单副标题2" , onclick,2 } ,
         { "菜单3" , "菜单副标题3" , onclick,3 } ,
     } , flushed , "主菜单" )

viewMultiChoice

参数1:一维表,是多选列表

参数2:function函数

 local multiTable={}
 for i=1,50 do
     table.insert(multiTable,i)
 end
 function onclick(items)
     gg.alert(tostring(items))--打印已经勾选的列表
 end
 local view = gg.viewMultiChoice(multiTable, onclick)
 gg.mainTabs("多选视图", view, false)

效果如下:可以搜索,批量勾选或取消勾选,挺方便的

 -- 在上面的基础上改进,为多选列表的每一项添加方法
 local multiTable={}
 for i=1,50 do
     table.insert(multiTable,i)
 end
 function fun1()
    gg.alert('这是功能1') 
 end
 function fun2()
    gg.alert('这是功能2') 
 end
 function onclick(items)
     --gg.alert(tostring(items))--打印已经勾选的列表
     -- 为多选的每一项添加自定义方法
     if items[1]==true then fun1() end
     if items[2]==true then fun2() end
     -- ....fun3,fun4
 end
 local view = gg.viewMultiChoice(multiTable, onclick)
 gg.mainTabs("多选视图", view, false)

viewPrompt

参数1:表

参数2:给键指定默认值

参数3:类型

参数4:函数

APP内置的示例内容挺丰富的,但一般人用不了这么复杂的,最常用的还是普通的输入框,滑动拖条啥的我觉得都不太好用。

这里给出APP的内置示例,可以自行运行测试一下:

 function onClick(tab)
     gg.alert(tostring(tab))
 end
 local view = gg.viewPrompt(
         { "内置单范围滑动条" ,
             "内置多范围滑动条" ,
             { "TapTap" , "IOS" , "4399" , "vivo" } ,
             { "TapTap" , "IOS" , "4399" , "vivo" } ,
             '内置单选标签输入框' ,
             '内置多选标签输入框' ,
             '输入框1' ,
             '输入框2' ,
             '勾选框1' ,
             '勾选框2' ,
             '文件路径' ,
             '文件'
         } ,
         { { from = -100 , to = 300 , value = 50 , size = 5 , tickVisible = false } ,
             { from = 10 , to = 200 , value = { 20 , 100 , 180 , 200 } } ,
             2 ,
             { 1 , 3 } ,
             { '苹果' , '橘子' , '草莓' , '香蕉' , '1315' , '1319' , '1514' , '1596' } ,
             { '苹果' , '橘子' , '草莓' , '香蕉' , '1315' , '1319' , '1514' , '1596' } ,
             '123' ,
             '456' ,
             true ,
             false ,
             '/storage/emulated/0/AppProjects/' ,
             '/storage/emulated/0/AppProjects/最新的luaj.zip'
         } ,
         { "slider" , "range_slider" , 'number' , "chip" , 'text' , "chip" , "number" , 'text' , 'checkbox' , 'checkbox' , 'path' , 'file' } , onClick )
 gg.mainTabs ( '输入框' , view , false  )

效果如图:

viewSwitch

 function switchAp ( Table , tabTitle )
     -- 开关封装
     local list = { }
     for ( k , v in pairs ( Table ) ) {
         table.insert ( list , { title = v [ 1 ] , open = v [ 2 ] , close = v [ 3 ] , isCheck = v [ 4 ] } )
     }
     local swit = gg.viewSwitch ( list )
     gg.mainTabs ( tabTitle , swit , false , window )
 end
 switchAp ( {
         { '人物无敌1(加载动画)' , function ( )
                 gg.sleep ( 3000 ) -- 模拟耗时
                 gg.toast ( '人物无敌1开启' )
             end
 ​
             , function ( )
                 gg.sleep ( 3000 ) -- 模拟耗时
                 gg.toast ( '人物无敌1关闭' )
             end
 ​
         } ,
         { '{?人物:#FFF86363:1:1:true}无敌2' , function ( )
                 gg.toast ( '人物无敌2开启' )
             end
 ​
             , function ( )
                 gg.toast ( '人物无敌2关闭' )
             end
 ​
             , true
         } ,
         { '人物无敌3' , function ( )
                 gg.toast ( '人物无敌3开启' )
             end
 ​
             , function ( )
                 gg.toast ( '人物无敌3关闭' )
             end
 ​
             , true
         } 
     } , "开关视图" )

效果如图:

viewText

参数1:字符串

 local view = gg.viewText ( '--------{?天启全功能脚本公告:#FFFFFFFF:1.5}--------{?2023.04.19:#FF486AFF:1:0:true}更新日志适配造梦13.4.1版本({?4399:#FFF86363:1:1:true})适配造梦13.4.1版本(渠道服)2023.04.17更新日志适配造梦13.4.0版本(4399)2023.03.26更新日志优化人物无敌(免疫debuff伤害)适配造梦13.3.4(4399)2023.03.23更新日志更换新的人物无敌功能(更无敌)修复了称号秒杀直接把属性加在面板上的问题降低了全局秒杀的伤害(当然,建议还是不要使用)2023.03.18更新日志新增奇闻录激活图鉴功能(装备功能>>开奇闻录)新增五中一键录入全角色白装(装备功能>>无中功能>>一键录入)移除全ID查询功能(目前有动态检索功能可以直接检索物品查ID)优化悬浮窗体验修复物理功能无限法宝无效问题2023.03.17更新日志新增雇佣功能(角色功能>>其他功能)[该功能还未完善]适配造梦13.3.2版本(4399)适配造梦13.3.2版本(渠道服)适配新版防闪(看见此公告请快速更新游戏)' )
 gg.mainTabs( '脚本公告' , view , false , window)

效果如图:

viewWeb

参数1:字符串 url

 local view = gg.viewWeb( 'https://sillage.wang')
 gg.mainTabs( '广告页' , view , false , window)

效果如图:

getHot()

获取AGG悬浮窗坐标

 local mHotPoint = gg.getHot()
 print("x坐标",mHotPoint.x)
 print("y坐标",mHotPoint.y)

getWM()

获取屏幕宽高

 local wm = gg.getWM()
 print("宽度",wm.width)
 print("高度",wm.height)

getProcessInfo()

 local proc = gg.getProcessInfo(ture)
 print(tostring(proc))

打印信息如下:

 脚本已结束::
 { -- table(b3e21e4)
     [1] = { -- table(220164d)
         ['libsPath'] = '/data/app/~~ke2MRFPxuQEJeBD1AzhtoQ==/bin.mt.plus.canary-Lem7T9L84MpmmdntKrulAA==/lib/x86',
         ['uid'] = 10045,
         ['name'] = 'MT管理器',
         ['pid'] = 2971,
         ['info'] = [2971] MT管理器 (sh) [x64] [2.76 MB],
         ['packageName'] = 'bin.mt.plus.canary',
         ['icon'] = android.graphics.drawable.AdaptiveIconDrawable@164ca49,
     }
 }

getClassMethods

 local wind = gg.getClassMethods("android.ext.MainService")--类名需要完整的路径
 for k , v in pairs(wind) do
     local paramter = { }
     for n , t in pairs(v.parameters) do
         local p_name = t.parameter_name--方法参数的名字
         local p_type = t.parameter_type--方法参数的类型
         local y_p_n = p_type
         table.insert(paramter, y_p_n.." "..p_name)
     end
     local up_par = table.concat(paramter , ", ")
     local r_t = v.return_type--方法的返回值
     local text = r_t.." "..v.method_name.."("..up_par..")"
     print(text)
 end

isTabVisible

检查Tab悬浮窗是否显示

 local view = gg.viewText("一段文字")
 gg.mainTabs("tab标题", view, false)
 gg.setTabVisible(false)--隐藏
 gg.alert("是否显示"..tostring(gg.isTabVisible()))
 gg.sleep(2000)
 gg.setTabVisible(true)--延迟两秒后显示
 gg.alert("是否显示"..tostring(gg.isTabVisible()))

isVPN()

检查VPN是否打开,打开返回true,否则返还false

 print(gg.isVPN())

notification()

调用系统权限发送通知

参数1:字符串,标题

参数2:字符串,内容

 gg.notification("AGG通知","醒醒,该起床了!")

setProcessInfo()

参数1:字符串,应用名

 gg.setProcessInfo('造梦西游OL')

setTabVisible()

 local view = gg.viewText("一段文字")
 gg.mainTabs("tab标题", view, false)
 gg.setTabVisible(false)--隐藏
 gg.sleep(2000)
 gg.setTabVisible(true)--延迟两秒后显示


此时相望不相闻,愿逐月华流照君。