大家好,我是郭立员~
前言
刚刚群里有人问获取的包名组件名不对怎么解决?
一般获取当前应用的包名组件名会使用山海插件的GetTopActivity命令,在低版本的安卓系统是可以的,但是到了高版本安卓系统获取的包名组件名就是错误的了。
一、分析错误的原因
随意打开一个app,运行获取包名组件名的代码,看一下:
Import "shanhai.lua"
TracePrint shanhai.GetTopActivity()
输出结果
com.android.launcher3/.Launcher
看返回值应该是桌面的包名组件名,并没有返回空值,说明GetTopActivity命令并没有失效,只是获取的不准确,猜测应该是插件内部关于提取包名组件名时出了问题。
二、查看GetTopActivity命令的源码
打开山海插件的源码:
function QMPlugin.GetTopActivity(mode)
sh_init()
local iRet, sRet = pcall(function()
local ret = Execute("dumpsys activity top ")
if ret ~= "" then
if mode then
if mode == 0 then
return string.match(ret, "ACTIVITY ([^/]+)")
elseif mode == 1 then
return string.match(ret, "ACTIVITY .-/([^ ]+)")
end
else
return string.match(ret,"ACTIVITY ([^ ]+)")
end
end
end)
if iRet == true then
return sRet
else
print(sRet)
return ""
end
end
分享源码可以知道我们所要的包名组件名信息来源adb shell命令的dumpsys activity top命令行。
运行adb命令查看dumpsys activity top命令行的返回值:
Import "shanhai.lua"
Dim ret = shanhai.Execute("dumpsys activity top ")
TracePrint ret
返回内容非常多,我这里就截个图:
山海插件的GetTopActivity是怎么提取想要的包名组件。
return string.match(ret,"ACTIVITY ([^ ]+)")
是使用正则匹配,表达式是以ACTIVITY开头,之后匹配非空格数据,这样就得到包名和组件名。
我在看全部返回值时发现有两个以ACTIVITY开头的内容。
ACTIVITY com.android.launcher3/.Launcher 4151806 pid=2445
ACTIVITY com.ss.android.ugc.aweme/.splash.SplashActivity 8bc803d pid=3456
GetTopActivity命令正则匹配的是第一个,匹配结果是手机桌面的包名组件名,而我们要的是第二个匹配结果,这就是为啥命令获取的结果不对的原因。
三、写个按键代码:
这里你如果对lua熟悉,就在写一个适用于高版本安卓的命令,我对于lua语言不太熟悉,仅限于看得懂,所以我是用按键写一下代码。
Import "shanhai.lua"
Dim ret = shanhai.Execute("dumpsys activity top ")
TracePrint ret
Dim arr = shanhai.RegexFind(ret,"ACTIVITY ([^ ]+)")
TracePrint arr[2]
原理上也是先用dumpsys activity top命令行获取全部返回值,然后正则匹配以ACTIVITY 开头的内容,得到结果选择第二个。
本文暂时没有评论,来添加一个吧(●'◡'●)