从 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/aapt
和adb 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 <any unique string from your pkg Name>
Linux 终端:
adb shell dumpsys window windows | grep -i <any unique string from your Pkg Name>
计算器包的输出为:
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
<PKg name>.<activity name>
=
<com.android.calculator2>.<Calculator>
所以.Calculator
是我们的活动
如果第二部分与包名称完全不同,并且似乎不包含在输出输出中 /
之前的 pkg 名称,那么整个
第二部分可以作为主要活动。
【讨论】:
【参考方案6】:这是查找应用程序包名称和启动器活动的另一种方法。
Step1:在命令提示符下启动“adb logcat”。
Step2:打开应用程序(在模拟器或真机中)
【讨论】:
这仅适用于该应用已在设备上至少启动一次的情况。 发现这是最简单的解决方案,不知道为什么不赞成。 非常有用的评论。谢谢。但是 adb logcat > log.txt 更有用,因为有很多信息被转储,以后很难找到所需的数据。 最佳解决方案,只需 ctrl+f 活动即可找到所需内容【参考方案7】:您还可以将 ddms 用于 logcat 日志,其中只需搜索应用程序名称即可获得所有信息,但您必须选择信息而不是详细或其他选项。检查下图。
【讨论】:
【参考方案8】:启动您的应用并将其置于前台。
运行以下命令:
adb shell dumpsys window windows |找到“mcurrentfocus”
【讨论】:
以上是关于从 adb 获取包的可启动活动名称的主要内容,如果未能解决你的问题,请参考以下文章