有没有办法从使用获取包的可启动活动adb?对于无根电话(即,无需从/data/app目录中拉出apk并使用检查appt)。
我尝试了dumpsys,但它不包含有关默认可启动活动的信息。
谢谢
Answers:
您不需要root即可从中拉出apk文件/data/app。当然,您可能没有列出该目录内容的权限,但是可以通过以下方式找到APK的文件位置:
adb shell pm list packages -f
然后,您可以使用adb pull:
adb pull <APK path from previous command>
然后aapt获取所需的信息:
aapt dump badging <pulledfile.apk>
aapt和adb pull用法,这对许多人来说似乎很有用。
$ 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甚至有更好的方法,请参见stackoverflow.com/a/41325792/1778421
android.intent.action.MAIN。正确的方法是首先找到android.intent.category.LAUNCHER类别之一。这样的事情会起作用grep -B 10 category\.LAUNCHER | grep -o '[^ ]*/[^ ]*' | tail -n 1
/system/bin/pm
从Android 7.0开始,您可以使用adb shell cmd package resolve-activitycommand来获取已安装应用的默认活动,如下所示:
adb shell "cmd package resolve-activity --brief com.google.android.calculator | tail -n 1"
com.google.android.calculator/com.android.calculator2.Calculator
#!/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
我没有列出它,所以更新了列表。
您需要先在手机上安装并运行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 Window{39ced4b1 u0 com.android.calculator2/com.android.calculator2.Calculator}:
mOwnerUid=10036 mShowToOwnerOnly=true package=com.android.calculator2 appop=NONE
mToken=AppWindowToken{29a4bed4 token=Token{2f850b1a ActivityRecord{eefe5c5 u0 com.android.calculator2/.Calculator t322}}}
mRootToken=AppWindowToken{29a4bed4 token=Token{2f850b1a ActivityRecord{eefe5c5 u0 com.android.calculator2/.Calculator t322}}}
mAppToken=AppWindowToken{29a4bed4 token=Token{2f850b1a ActivityRecord{eefe5c5 u0 com.android.calculator2/.Calculator t322}}}
WindowStateAnimator{3e160d22 com.android.calculator2/com.android.calculator2.Calculator}:
mSurface=Surface(name=com.android.calculator2/com.android.calculator2.Calculator)
mCurrentFocus=Window{39ced4b1 u0 com.android.calculator2/com.android.calculator2.Calculator}
mFocusedApp=AppWindowToken{29a4bed4 token=Token{2f850b1a ActivityRecord{eefe5c5 u0 com.android.calculator2/.Calculator t322}}}
主要部分是第一行:
Window #7 Window{39ced4b1 u0 com.android.calculator2/com.android.calculator2.Calculator}:
输出的第一部分是程序包名称:
com.android.calculator2
输出的第二部分(在后面/)可以是两件事,在我们的例子中是:
com.android.calculator2.Calculator
<PKg name>.<activity name> =
<com.android.calculator2>.<Calculator>
.Calculator我们的活动也是如此
如果第二部分与软件包名称完全不同,并且似乎不包含/in out输出之前的pkg名称,则整个第二部分都可以用作主要活动。