性能测试之使用 adb 查看设备CPU占用与数据分析
一、如何使用 adb 获取CPU占用
1、运行 top 命令:
adb shell top
输出结果:

-
-d <秒>: 设置刷新间隔,如 top -d 1 每秒刷新一次。
-
-m <数量>: 显示最多多少行进程,如 top -m 10显示前10个进程。
-
-s <列名>: 按某列排序,如 top -s cpu按CPU占用率排序(-s r也可以),top -s res按内存占用排序。
2、在 top 交互界面中(运行 top 命令后)
- 按 q:退出。
- 按 M:按内存使用率(%MEM)排序。
- 按 P:按CPU使用率(%CPU)排序。这是最常用的。
- 按 R:反转排序顺序。
3、快速查看进程的CPU实时占用率
adb shell top -n 1|grep<package_name>
Windows系统请注意: grep 是一个在 Linux/Unix/macOS 等类 Unix 系统中才存在的文本搜索工具。而 Windows 系统的命令行环境默认没有这个命令。需要现在 CMD 中输入:adb shell 然后,在出现的设备命令行 $ 或 #后,输入:top -n 1 | grep <package_name>"
注:-n 1 代表只刷新一次,避免刷屏。去掉此参数可进行简单实时监控,按 Ctrl+C 退出。
二、数据解析

输出的数据主要包括:
进程标识:PID, USER, ARGS
调度优先级:PR, NI
内存使用:VIRT, RES, SHR, %MEM
CPU 和状态:S, %CPU
运行时间:TIME+
各列详细含义
下面我们逐列进行解释:
- PID
全称: Process ID
含义: 进程的唯一标识符。操作系统通过这个数字来识别和管理进程。
解读: 数字越大,通常意味着进程启动得越晚。如果你想监控某个特定的进程(比如一个App),你需要找到它的PID。 - USER
含义: 运行此进程的用户身份。
解读: 在Android中,你通常会看到 root、system、u0_a123(其中数字代表App的用户ID)等。这可以帮助你判断进程是系统进程、系统服务还是第三方应用。 - PR
全称: Priority
含义: 进程的实时优先级。这是由Linux内核调度的优先级。
解读: 数字越小,优先级越高,越容易被调度执行。这个值通常由内核动态调整,普通应用开发者很少直接修改它。 - NI
全称: Nice Value
含义: 进程的“友好度”,是用户空间可以调整的优先级修正值。
解读: 取值范围通常是 -20 到 19。值越低(负值),优先级越高;值越高(正值),优先级越低,表示进程更“友好”,更愿意让出CPU。默认值为0。 - VIRT
全称: Virtual Memory Size
含义: 进程使用的虚拟内存总量。
解读: 它包括应用程序代码、数据、共享库以及已经换出到磁盘(Swap)的内存等。这个值通常很大,因为它包含了进程“有权访问”的所有内存,但不一定都在物理内存中。 - RES
全称: Resident Memory Size
含义: 进程当前使用的、未被换出的物理内存大小(单位通常是KB)。
解读: 这是衡量一个进程实际占用多少宝贵物理内存的关键指标。RES 是 VIRT 中真正在物理内存中的那一部分。 - SHR
全称: Shared Memory Size
含义: RES 中可以被其他进程共享的内存大小。
解读: 主要是共享库(如系统库 .so 文件)占用的内存。多个进程使用同一个库时,这个库在物理内存中只有一份,但会被多个进程共享计算到它们的 SHR 中。 - S
全称: Process Status
含义: 进程的状态。
常见状态:
- R:正在运行或可运行(Running/Runnable)
- S:睡眠状态(Sleeping),通常在等待某个事件(如I/O操作)
- D:不可中断的睡眠(Uninterruptible Sleep),通常是在等待I/O,不能被信号唤醒
- Z:僵尸进程(Zombie),进程已终止,但其父进程尚未回收其资源
- T:已停止(Stopped),通常是由于作业控制信号(如
SIGSTOP)
- %CPU
含义: 这是你最关心的列。它表示从上一次刷新到当前时刻,进程占用CPU的百分比。
解读: 对于一个单核CPU,100%表示这个进程占满了整个核心。对于一个多核CPU(如8核),这个值可以超过100%。例如,如果一个进程在8核设备上占满了2个核心,那么它的 %CPU 就会显示 200%。这是排查CPU性能问题和耗电问题的首要观察指标。 - %MEM
含义: 进程使用的物理内存(RES)占系统总物理内存的百分比。
解读: 帮助你快速识别内存消耗大户。 - TIME+
含义: 进程自启动以来,总共在CPU中运行的时间。
解读: +表示显示精度到百分之一秒。格式为 MMM:SS.ss。例如 12:34.56表示12分钟34.56秒。这个值持续快速增长,说明该进程长期在消耗CPU。 - ARGS
全称: Arguments
含义: 启动该进程的命令行或进程名/包名。
解读: 在Android中,这通常显示为应用的包(如 com.android.chrome)或系统进程名(如 system_server, com.android.phone)。这是识别进程归属的最直接方式。
三、举例说明
假设你看到一行:
12345 u0_a123 20 0 1.2G 150M 80M R 45.6 3.8 1:23.45 com.example.myapp
这表示:
PID 12345,
由用户 u0_a123(一个应用)启动。
优先级(PR/NI)是 20/0,是标准优先级。使用了 1.2GB 虚拟内存,但实际占用了 150MB 物理内存,其中 80MB 是共享库。
进程状态是 R,正在运行。
在过去的一个采样周期内,CPU 占用率高达 45.6%。
它占用了设备总内存的 3.8%。
从启动到现在,它累计在 CPU 上运行了 1分钟23.45秒。
这个进程是包名为 com.example.myapp 的应用。
通过这个分析,你可以快速定位到是哪个应用(com.example.myapp)正在大量消耗CPU资源,从而进行下一步的优化或排查。
四、判断标准与总结
现在我们学会了如何查看应用的CPU占用率,当应用长时间(超过1分钟)维持在80%以上,尤其是用户没有明显操作时,会导致设备发热、卡顿、耗电加快,这通常意味着存在性能问题。
