菜鸟科技网

安卓设备如何使用ps命令查看进程?

ps 命令是 Process Status(进程状态)的缩写,它是 Linux/Unix 系统中最基本、最常用的命令之一,用于查看当前正在运行的进程,Android 系统基于 Linux 内核,ps 命令也是 Android 开发和调试中不可或缺的工具。

安卓设备如何使用ps命令查看进程?-图1
(图片来源网络,侵删)

ps 命令的基本用法

在 Android 设备或模拟器的终端(如通过 adb shell 进入)中,直接输入 ps 命令会显示当前系统中所有进程的简要信息。

基本格式

ps

输出示例

USER     PID   PPID  VSIZE  RSS   WCHAN    PC        NAME
root     1     0     0      0     c003e3a8 00000000 S /init
root     2     0     0      0     c005a1d8 00000000 S kthreadd
...
u0_a123  5678  1234  123456 7890  ffffffff b6db1e40 S com.example.myapp
...
shell    9876  1     0      0     c003e3a8 00000000 S /system/bin/sh

输出列详解

  • USER: 运行该进程的用户,在 Android 中,root 是超级用户,u0_a123 是一个普通应用的用户(u0 表示非系统用户,a123 是应用 UID 的一部分)。
  • PID: Process ID,进程的唯一标识符。
  • PPID: Parent Process ID,父进程的 ID,通过这个可以追溯进程的启动链(init 进程是所有进程的祖先)。
  • VSIZE: Virtual Size (虚拟内存大小),进程占用的虚拟内存总量,单位是 KB。
  • RSS: Resident Set Size (常驻内存集大小),进程实际占用的物理内存大小,单位是 KB,这个值比 VSIZE 更能反映进程的真实内存消耗。
  • WCHAN: Wait Channel,进程等待的内核函数地址,通常用于调试。
  • PC: Program Counter,程序计数器,指向当前执行的指令地址。
  • NAME: 进程的名称,对于应用,通常是应用的包名(如 com.example.myapp);对于系统服务,通常是可执行文件路径(如 /system/bin/mediaserver)。

常用选项(Flags)

ps 命令支持多种选项来过滤和格式化输出,使其更易于使用。

-A-e

显示所有进程,在 Android 中,默认的 ps 命令通常已经显示所有进程,所以这个选项的作用可能不明显。

ps -A

-f (Full Format)

以“完整格式”显示进程,包含命令行参数(CMD 列),这对于识别带有参数启动的进程非常有用。

安卓设备如何使用ps命令查看进程?-图2
(图片来源网络,侵删)
ps -f

输出示例 (关键区别在于 CMD 列):

UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0 0 10:10:00 ?     00:00:00 /init
u0_a123   5678  1234 0 10:15:00 ?     00:00:05 com.example.myapp

这里的 CMD 列比 NAME 列更详细。

-T (Threads)

显示进程的所有线程,这对于分析多线程应用或排查 ANR(Application Not Responding)问题至关重要。

ps -T

输出中会多出一列 TG (Thread Group),通常和 PID 相同,而 SPID (Scheduler Process ID) 则是每个线程的唯一 ID。

安卓设备如何使用ps命令查看进程?-图3
(图片来源网络,侵删)

-p <pid> (Specific PID)

只显示指定 PID 的进程信息。

# 查看 PID 为 5678 的进程详情
ps -p 5678

-C <command> (Specific Command)

只显示指定命令名的进程。

# 查找所有名为 'zygote' 的进程
ps -C zygote

-o (Custom Output)

自定义输出的列,你可以指定你想要查看的列名。

# 只显示 PID, NAME, RSS 三列
ps -o PID,NAME,RSS

常用列名:pid, ppid, user, cmd, rss, vsz

--sort <key>

根据指定的键对进程进行排序,按内存使用量降序排列。

# 按 RSS (常驻内存) 降序排列
ps --sort=-rss
# 按 CPU 使用时间排序 (需要 ps 支持 %cpu 列)
ps --sort=-%cpu

注意: 在 Android 原生 ps 中,%cpu 列默认不显示,但一些 ps 版本(如 procrankps -o pid,pcpu,pmem,cmd)可以获取 CPU 使用率。


在 Android 开发中的实际应用

场景1:查找自己应用的进程

这是最常见的用法,你需要知道你的应用的包名。

# 假设你的应用包名是 com.mycompany.myapp
adb shell "ps | grep com.mycompany.myapp"

输出可能如下:

u0_a123  5678  1234 123456 7890 ?  S com.mycompany.myapp

这表明你的应用正在运行,进程 ID 是 5678

场景2:分析内存占用

如果你想看看哪个应用占用了最多的内存,可以结合 sort 命令。

# 显示所有进程的 PID, NAME, RSS,并按 RSS 降序排列
adb shell "ps -o PID,NAME,RSS | grep -v RSS | sort -nr -k3"

命令分解:

  1. adb shell "...": 在 shell 中执行命令。
  2. ps -o PID,NAME,RSS: 只获取三列数据。
  3. grep -v RSS: 过滤掉标题行 PID NAME RSS
  4. sort -nr -k3: 对结果进行排序。
    • -n: 数字排序。
    • -r: 降序(从大到小)。
    • -k3: 按第三列(RSS)排序。

场景3:排查 ANR 问题

ANR 发生时,系统会生成一个 traces.txt 文件,其中包含了发生 ANR 时所有线程的堆栈信息,你可以用 ps -T 来查看对应进程的线程状态,与 traces.txt 中的信息进行比对,找出是哪个线程卡住了。

# 假设 ANR 发生在 com.example.myapp (PID=5678)
# 查看 5678 进程的所有线程
adb shell "ps -T -p 5678"

你会看到类似 T (暂停)、S (睡眠)、R (运行) 等线程状态,这有助于定位问题。

场景4:查看进程的启动命令和参数

使用 ps -f 可以看到进程是如何被启动的,这对于分析系统服务或调试启动问题很有帮助。

# 查看媒体服务进程的完整启动命令
adb shell "ps -f | grep mediaserver"

ps 的替代品和增强工具

虽然 ps 很强大,但在 Android 开发中,我们通常使用更高级的工具来获取更丰富的信息。

top 命令

top 是一个交互式的进程查看器,它可以实时更新进程列表,并显示 CPU 和内存的使用情况,非常适合监控系统的实时负载。

adb shell top

top 界面中,你可以按 k 然后输入 PID 来杀死进程,按 m 按内存排序,按 c 按命令排序等。

procrank

这是一个非常实用的工具,可以按内存使用情况对进程进行排序,它显示的是 PSS (Proportional Set Size),这是衡量 Android 应用内存占用的最佳指标

# 需要 root 权限才能使用
adb shell procrank

输出会清晰地列出每个进程的 PSS、USS (Unique Set Size) 等内存值。

dumpsys meminfo

这是 Android 开发中最强大的内存分析工具之一,它提供特定进程(或系统)非常详细的内存使用报告,包括 Dalvik/ART Heap、Native Heap、共享内存等。

# 查看特定应用的内存信息
adb shell dumpsys meminfo com.example.myapp
# 查看整个系统的内存摘要
adb shell dumpsys meminfo

工具 主要用途 特点
ps 快速查看进程列表、PID、用户、内存等基本信息 快速、简单,是系统内置的基础命令
top 实时监控进程的 CPU、内存使用情况 交互式、动态更新,适合观察系统负载
procrank 按 PSS 内存对进程进行排序 直观显示内存占用,需要 root
dumpsys meminfo 深入分析单个进程的内存详情 功能最强大,是 Android 开发必备

对于日常的快速检查,pstop 是你的首选,对于深入的内存问题分析,dumpsys meminfo 则是利器,掌握 ps 命令是理解 Android 系统和进行高效调试的第一步。

分享:
扫描分享到社交APP
上一篇
下一篇