程序员开发实例大全宝库

网站首页 > 编程文章 正文

[按键精灵]比较高的安卓系统该怎么获取包名组件名

zazugpt 2024-09-02 04:32:50 编程文章 39 ℃ 0 评论

大家好,我是郭立员~

前言

刚刚群里有人问获取的包名组件名不对怎么解决?

一般获取当前应用的包名组件名会使用山海插件的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 开头的内容,得到结果选择第二个。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表