我正在编写一个脚本,我需要提供我的应用程序的PID.我可以通过以下命令列出所有进程及其PID,并可以看到我的应用程序的条目.
adb shell ps
这给了我一个巨大的进程列表.我需要一个条目(我可以进一步提供给另一个命令),所以我想用包名过滤这个结果.grep命令在我的Windows机器上不起作用.也尝试了以下命令,但它没有帮助.
adb shell ps name:my_app_package
Ale*_* P. 24
从Android 7.0开始,按包名查找进程ID的最简单方法是使用pidof命令:
usage: pidof [-s] [-o omitpid[,omitpid...]] [NAME]...
Print the PIDs of all processes with the given names.
-s single shot, only return one pid.
-o omit PID(s)
Run Code Online (Sandbox Code Playgroud)
就像这样运行它:
adb shell pidof my.app.package
Run Code Online (Sandbox Code Playgroud)
在7.0之前的Android中,人们使用ps命令然后使用内置的按comm值过滤(对于Android应用程序是包名称的最后15个字符)或grep命令来解析其输出.comm如果名称的最后15个字符以数字开头,并且grep默认情况下未包含在Android 4.2中,则过滤器不起作用.但即使找到了正确的生产线,PID仍然需要提取该值.
有多种方法可以做到这一点.以下是使用单个sed命令查找进程和提取PID的方法:
adb shell "ps | sed -n 's/^[^ ]* *\([0-9]*\).* my\.app\.package$/\1/p'"
Run Code Online (Sandbox Code Playgroud)
问题是,sed在Android 6.0之前,默认情况下并未包含该问题.
但是,如果您必须使用较旧的设备,则可以始终使用以下Android版本独立解决方案.它不使用任何外部命令 - 只是Android shell内置命令:
adb shell "for p in /proc/[0-9]*; do [[ $(<$p/cmdline) = my.app.package ]] && echo ${p##*/}; done"
Run Code Online (Sandbox Code Playgroud)
寻找PID的最常见原因是在其他命令中使用它kill.假设我们有多个logcat运行实例,我们想要一次性优雅地完成它们.只需在最后一个命令中替换echowith kill -2:
adb shell "for p in /proc/[0-9]*; do [[ $(<$p/cmdline) = logcat ]] && kill -2 ${p##*/}; done"
Run Code Online (Sandbox Code Playgroud)
如果从Linux/OSX shell运行命令",'则替换为.
Dev*_*rim 11
而不是使用adb shell ps,首先输入adb shell然后使用ps.
一步步:
adb shell连接设备(或仿真器)时输入命令.
(命令行前缀将shell@android:/ $在执行此命令后执行.)
输入ps | grep <package_name_to_be_filtered>(即ps | grep com.google).
C:> adb shell
shell@android:/ $ ps | grep com.google
u0_a64 3353 2467 903744 52904 ffffffff 00000000 S com.google.process.location
u0_a64 3426 2467 893964 49452 ffffffff 00000000 S com.google.process.gapps
Run Code Online (Sandbox Code Playgroud)
ps 显示的进程可以限制为属于任何给定用户的进程,方法是通过 grep(一个用于搜索文本的过滤器)管道输出。例如,属于用户名为 adam 的用户的进程可以通过以下方式显示:
ps -ef | grep adam
Run Code Online (Sandbox Code Playgroud)
-e 选项生成有关当前运行的每个进程的信息列表。-f 选项生成的列表包含的每个进程的信息项少于 -l 选项。
| 归档时间: |
|
| 查看次数: |
20184 次 |
| 最近记录: |