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

fru*_*ice 67 android adb

有没有办法让包的可启动活动使用adb?对于unroot手机(即没有从/data/app目录中拉出apk 并检查appt).

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

谢谢

kab*_*uko 90

你不需要root来从中提取apk文件/data/app.当然,您可能没有权限列出该目录的内容,但您可以找到APK的文件位置:

adb shell pm list packages -f
Run Code Online (Sandbox Code Playgroud)

然后你可以使用adb pull:

adb pull <APK path from previous command>
Run Code Online (Sandbox Code Playgroud)

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

aapt dump badging <pulledfile.apk>
Run Code Online (Sandbox Code Playgroud)

  • 可以在StackOverflow上找到aapt用法:http://stackoverflow.com/a/7502519/26510 (12认同)
  • 1,做kabuko说2,adb pull/data/app/<THE APK.apk>〜/ <你希望它在哪里> 3,aapt dump badging <THE APK.apk>那就是它 (3认同)
  • 我需要"aapt dump xmltree HiddenMenuLight.apk AndroidManifest.xml" (2认同)

fri*_*mle 45

$ adb shell pm dump PACKAGE_NAME | grep -A 1 MAIN
Run Code Online (Sandbox Code Playgroud)

  • `$ adb shell pm dump PACKAGE_NAME | grep -A 1'过滤器'| 头-n 1 | cut -d'' - f 12`这可能是一个更聪明的方式,但我不是没有*NIX大师. (3认同)
  • `pm dump`转储许多不必要的服务.和`pm`本身是一个java命令,所以它需要一些时间来启动.输出的相关部分来自`PackageManager.Dump()`无论如何 - 所以'adb shell dumpsys包PACKAGE_NAME`对于产生相同的结果会更有效.但是对于Android 7.0+甚至有更好的方法,请参阅http://stackoverflow.com/a/41325792/1778421 (3认同)
  • @Kristopher,你和@ friederbluemle的过滤器的问题是`android.intent.action.MAIN`可能有多个解析器.正确的方法是先找到一个`android.intent.category.LAUNCHER`类别.像这样的东西可以工作`grep -B 10 category\.LAUNCHER | grep -o'[^]*/[^]*'| 尾巴-n 1` (2认同)

Ale*_* P. 17

从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
Run Code Online (Sandbox Code Playgroud)


Pra*_*ord 11

我没有找到它列出所以更新列表.

您需要在手机上安装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>

计算器包的OUTPUT将是:

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}}}
Run Code Online (Sandbox Code Playgroud)

主要部分是,第一线:

Window #7 Window{39ced4b1 u0 com.android.calculator2/com.android.calculator2.Calculator}:

输出的第一部分是包名:

com.android.calculator2

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

com.android.calculator2.Calculator

  1. <PKg name>.<activity name> = <com.android.calculator2>.<Calculator>

    .Calculator我们的活动也是如此

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


小智 10

#!/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'
Run Code Online (Sandbox Code Playgroud)

样品:

getActivity.sh com.tencent.mm
com.tencent.mm/.ui.LauncherUI
Run Code Online (Sandbox Code Playgroud)