从 adb 获取包的可启动活动名称

Posted

技术标签:

【中文标题】从 adb 获取包的可启动活动名称【英文标题】:get launchable activity name of package from adb 【发布时间】:2012-09-23 19:25:59 【问题描述】:

有没有办法通过使用adb 来获取包的可启动活动?对于 unroot 手机(即无需从 /data/app 目录中提取 apk 并使用 appt 进行检查)。

我尝试了 dumpsys,但它不包含有关默认可启动活动的信息。

谢谢

【问题讨论】:

【参考方案1】:

您无需 root 即可从 /data/app 拉取 apk 文件。当然,您可能没有权限列出该目录的内容,但您可以通过以下方式找到 APK 的文件位置:

adb shell pm list packages -f

那么你可以使用adb pull:

adb pull <APK path from previous command>

然后aapt获取你想要的信息:

aapt dump badging <pulledfile.apk>

【讨论】:

和 aapt 用法可以在 *** 上找到:***.com/a/7502519/26510 1, 照 kabuko 说的做 2, adb pull /data/app/ ~/ 3, aapt dump badging 就这样 我刚刚在答案中添加了aaptadb pull 用法,它似乎对很多人都有用。 @Vera 没有。它是 ADT 中适用于所有平台的工具。确保已安装构建工具并查看 build-tools 文件夹。它应该位于与您的 SDK 对应的另一个子文件夹下。 我需要“aapt dump xmltree HiddenMenuLight.apk androidManifest.xml”【参考方案2】:
$ adb shell pm dump PACKAGE_NAME | grep -A 1 MAIN

【讨论】:

$ adb shell pm dump PACKAGE_NAME | grep -A 1 'filter' | head -n 1 | cut -d ' ' -f 12 可能有更聪明的方法,但我不是 *NIX 大师。 pm dump 转储了许多不必要的服务。而pm 本身就是一个 java 命令,所以需要一些时间才能启动。无论如何,输出的相关部分来自PackageManager.Dump() - 所以adb shell dumpsys package PACKAGE_NAME 会更有效地产生相同的结果。但是对于 Android 7.0+ 还有更好的方法,请参阅***.com/a/41325792/1778421 @Kristopher,你和@friederbluemle 的过滤器的问题在于android.intent.action.MAIN 可能有多个解析器。正确的方法是首先找到android.intent.category.LAUNCHER 类别之一。这样的事情会起作用grep -B 10 category\.LAUNCHER | grep -o '[^ ]*/[^ ]*' | tail -n 1 @m0skit0 您使用的是哪个模拟器/设备?检查你使用的是哪个框架版本以及/system/bin/pm的内容【参考方案3】:

从 Android 7.0 开始,您可以使用 adb shell cmd package resolve-activity 命令获取已安装应用的默认活动,如下所示:

adb shell "cmd package resolve-activity --brief com.google.android.calculator | tail -n 1"
com.google.android.calculator/com.android.calculator2.Calculator

【讨论】:

我在 android 9 上收到此错误:执行时发生异常:java.lang.IllegalArgumentException:未提供意图【参考方案4】:
#!/bin/bash
#file getActivity.sh
package_name=$1
#launch app by package name
adb shell monkey -p $package_name -c android.intent.category.LAUNCHER 1;
sleep 1;
#get Activity name
adb shell logcat -d | grep 'START u0' | tail -n 1 | sed 's/.*cmp=\(.*\) .*/\1/g'

样本:

getActivity.sh com.tencent.mm
com.tencent.mm/.ui.LauncherUI

【讨论】:

【参考方案5】:

我没有找到它,所以更新列表。

您需要在手机前面安装并运行此解决方案的 apk

Windows CMD 行:

adb shell dumpsys window windows | findstr &lt;any unique string from your pkg Name&gt;

Linux 终端:

adb shell dumpsys window windows | grep -i &lt;any unique string from your Pkg Name&gt;

计算器包的输出为:

Window #7 Window39ced4b1 u0 com.android.calculator2/com.android.calculator2.Calculator:

    mOwnerUid=10036 mShowToOwnerOnly=true package=com.android.calculator2 appop=NONE

    mToken=AppWindowToken29a4bed4 token=Token2f850b1a ActivityRecordeefe5c5 u0 com.android.calculator2/.Calculator t322

    mRootToken=AppWindowToken29a4bed4 token=Token2f850b1a ActivityRecordeefe5c5 u0 com.android.calculator2/.Calculator t322

    mAppToken=AppWindowToken29a4bed4 token=Token2f850b1a ActivityRecordeefe5c5 u0 com.android.calculator2/.Calculator t322

    WindowStateAnimator3e160d22 com.android.calculator2/com.android.calculator2.Calculator:

      mSurface=Surface(name=com.android.calculator2/com.android.calculator2.Calculator)

  mCurrentFocus=Window39ced4b1 u0 com.android.calculator2/com.android.calculator2.Calculator

  mFocusedApp=AppWindowToken29a4bed4 token=Token2f850b1a ActivityRecordeefe5c5 u0 com.android.calculator2/.Calculator t322

主要部分是,第一行

Window #7 Window39ced4b1 u0 com.android.calculator2/com.android.calculator2.Calculator:

输出的第一部分是包名:

com.android.calculator2

输出的第二部分(在/ 之后)可以是两件事,在我们的例子中是:

com.android.calculator2.Calculator

    &lt;PKg name&gt;.&lt;activity name&gt; = &lt;com.android.calculator2&gt;.&lt;Calculator&gt;

    所以.Calculator是我们的活动

    如果第二部分与包名称完全不同,并且似乎不包含在输出输出中 / 之前的 pkg 名称,那么整个 第二部分可以作为主要活动。

【讨论】:

【参考方案6】:

这是查找应用程序包名称和启动器活动的另一种方法。

Step1:在命令提示符下启动“adb logcat”。

Step2:打开应用程序(在模拟器或真机中)

【讨论】:

这仅适用于该应用已在设备上至少启动一次的情况。 发现这是最简单的解决方案,不知道为什么不赞成。 非常有用的评论。谢谢。但是 adb logcat > log.txt 更有用,因为有很多信息被转储,以后很难找到所需的数据。 最佳解决方案,只需 ctrl+f 活动即可找到所需内容【参考方案7】:

您还可以将 ddms 用于 logcat 日志,其中只需搜索应用程序名称即可获得所有信息,但您必须选择信息而不是详细或其他选项。检查下图。

【讨论】:

【参考方案8】:

启动您的应用并将其置于前台。

运行以下命令:

adb shell dumpsys window windows |找到“mcurrentfocus”

【讨论】:

以上是关于从 adb 获取包的可启动活动名称的主要内容,如果未能解决你的问题,请参考以下文章

adb 获取app包名和当前的activity名称

如何获取apk包的包名和activity

adb命令获取app包名

如何从片段到活动而不会干扰片段的可重用性

从 C++ 中的可执行路径(或从 hWnd,或从 pid)获取程序名称

从android中的应用程序名称获取包名称[重复]