如何使用ADB命令检测正在运行的应用程序

66

我有一台运行Jelly Bean操作系统的Android设备。

如果我知道软件包名称,是否有使用ADB命令检测进程是否正在运行的方法?

6个回答

91
不需要使用grep。在Android中,ps可以通过COMM值进行过滤(对于Java应用程序而言,它是包名称的最后15个字符)。
假设我们想要检查com.android.phone是否正在运行:
adb shell ps m.android.phone
USER     PID   PPID  VSIZE  RSS     WCHAN    PC         NAME
radio     1389  277   515960 33964 ffffffff 4024c270 S com.android.phone

在Android 7.0中,过滤psCOMM值选项已移除。要检查Android 7.0中运行的进程名称,可以使用pidof命令:

adb shell pidof com.android.phone

如果找到了该进程,则返回PID,否则返回空字符串。

4
请注意,如果一个包名的最后15个字符以数字开头,则此操作将失败。(例如:com.number13.example.debug,其中最后15个字符是“3.example.debug”)原因?该命令会根据进程ID而非进程名称进行过滤,如果第一个字符是数字,则会出现这种情况:https://github.com/android/platform_system_core/blob/master/toolbox/ps.c#L295 - Madis Pink
pidof的一个注意事项:有时候当我执行readlink /proc/$PID/exe时,会得到“已删除”的进程。 - jozxyqk
太好了!谢谢! 它在Android 7.0(Galaxy S8 +)和8.0(模拟器)上运行。 - hungtdo
但需要root设备或当前进度完全没有!:( - hungtdo
对于Windows用户,adb shell "ps | grep apps | awk '{print $9}'" - S. Ber Rosenberg

35

您可以使用

adb shell ps | grep apps | awk '{print $9}'

生成类似以下输出:
com.google.process.gapps
com.google.android.apps.uploader
com.google.android.apps.plus
com.google.android.apps.maps
com.google.android.apps.maps:GoogleLocationService
com.google.android.apps.maps:FriendService
com.google.android.apps.maps:LocationFriendService

adb shell ps命令返回Android设备上所有正在运行的进程列表,grep apps命令搜索包含“apps”的任何行,如上所示它们都是com.google.android.APPS或GAPPS,awk提取第9列,即此情况下的包名。

要搜索特定的包,请使用:

adb shell ps | grep PACKAGE.NAME.HERE | awk '{print $9}'

即,运行 adb shell ps | grep com.we7.player | awk '{print $9}' 命令,如果应用正在运行,则会显示名称;否则,不会返回任何结果。


我应该执行 adb shell dumpsys activity processes | grep apps | awk '{print $9}' 吗? - RPB
基本思路是正确的,但这个命令序列只有在自定义ROM或已安装busybox的情况下才可能起作用,因为官方Android版本最近才添加了grep,并且仍然没有awk。 - Chris Stratton
1
我在运行6.0的Nexus 6上的终端模拟器中发现awk未找到。这里有什么我漏掉的吗? - Hendra Anggrian
1
@GenePavlovsky,不需要使用read。只需使用tr -s ' '来删除连续的空格,就像这样:adb shel "ps | tr -s ' ' | cut -d' ' -f9 | grep '^com.google.android.gms$'" - Alex P.
我收到了这个错误信息:'/system/bin/sh: awk: not found'。 - user2934930
显示剩余5条评论

30
如果您想要直接获取当前应用程序的包名,请使用以下adb命令 -
adb shell "dumpsys activity activities | grep mResumedActivity | cut -d "{" -f2 | cut -d ' ' -f3 | cut -d "/" -f1"

使用cut命令删除adb命令结果中的额外信息。原始解决方案来自这里


1
我喜欢这个,尽管我不得不使用-f 6。它总是产生相同的输出吗? - Arnaldo Capo
@ArnaldoCapo 对我来说,使用-f 6无法工作。没有切割命令,这是我得到的完整输出: mFocusedApp = AppWindowToken {eb42ebb token = Token {f96bf4a ActivityRecord {d040cb5 u0 com.package/.MainNavBarActivity t8679}}} 因此,-f 6会产生“u0”。我还没有检查过,但我希望它在设备和Android版本之间始终产生相同的输出。你能否粘贴没有切割的完整输出? - vepzfe
像魔法一样好用。谢谢! - Nisim Naim
在Android 11上,mFocusedApp对我不起作用 - dumpsys的输出根本没有包含任何mFocusedApp的出现。相反,我成功地使用了mObscuringWindow,它似乎以同样的方式工作! - Luke Needham
我得到了这个命令 - adb shell dumpsys window windows | grep -E 'mObscuringWindow'| cut -d / -f 1 | cut -d " " -f5。然而,在我的Android 11 Pixel上,这个命令似乎不起作用。在Android 7 Motorola上也不起作用。只有在Android 12 OnePlus上才能正常工作。但是,我发布的新解决方案适用于所有设备。 - vepzfe
显示剩余2条评论

16

我刚刚注意到在adb中可以使用top,因此您可以执行以下操作:

Translated:

我刚刚注意到在adb中可以使用top,因此您可以执行类似的操作。

  adb shell
  top -m 5

监控消耗前五高CPU的进程。

或者

  adb shell top -m 5 -s cpu -n 20 |tee top.log

将其录制一分钟,并将输出收集到计算机文件中。


1
我很感谢你的回答,但这不是我要找的! - RPB
1
很好,只需在“-m”标志后添加空格,如“-m 5”。 - Grasshopper

8

尝试:

adb shell pidof <myPackageName>

如果应用程序没有运行,标准输出将为空。否则,它会输出PID。


3

或者,您可以选择使用pgrep或进程grep。(需要Busybox)

您可以执行adb shell pgrep com.example.app,它将仅显示进程ID。

作为建议,由于Android是Linux,因此您可以使用大多数基本的Linux命令来通过adb shell进行导航/控制。 :D


谢谢回复,但是在我的设备上它会报错,显示"/system/bin/sh: pgrep: not found"。 - RPB
3
安卓系统不支持grep命令。 - Ryhan
2
@Rinkalkumar 您需要安装 busybox。 - kevin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接