菜鸟科技网

android top 命令

top 命令是一个实时、动态的进程监控工具,它类似于 Windows 任务管理器或 macOS 的活动监视器,可以让你直观地看到当前系统中正在运行的进程及其资源占用情况,这对于分析应用性能、定位内存泄漏、排查 ANR (Application Not Responding) 问题等至关重要。

android top 命令-图1
(图片来源网络,侵删)

如何进入 top 命令

你通常通过 adb (Android Debug Bridge) 连接到设备或模拟器来使用 top 命令。

  1. 确保设备已连接并启用 ADB 调试模式

  2. 打开终端或命令行工具。

  3. 执行以下命令进入交互式 top 界面:

    android top 命令-图2
    (图片来源网络,侵删)
    adb shell top

进入后,你会看到一个类似下面这样的界面,并且会实时刷新:

User 0, PID 12345
 100%  15% 12345 com.android.systemui  S 0  12345  6000 450000 1000000 S  0.0% 0.0% 0.0% Foreground
  80%  10% 12346 com.example.myapp      R 0  12346  7000 500000 1200000 R  5.0% 2.0% 1.0% MyApp
  50%   5% 12347 com.android.phone     S 0  12347  5000 400000  900000 S  0.0% 0.0% 0.0% Phone
  30%   2% 12348 adbd                   S 0  12348  3000 350000  800000 S  0.0% 0.0% 0.0% adbd
  ...

top 命令输出详解

我们来逐行解析上面的输出示例。

第一行:标题行

User 0, PID 12345
  • User 0: 表示当前查看的是用户为 rootshell 的进程,在 Android 中,普通应用运行在独立的用户空间下。
  • PID 12345: 这是你当前选中的进程的 进程ID (Process ID),在交互模式下,你可以按 s 键来指定监控某个特定 PID。

数据行:每个进程的信息

 100%  15% 12345 com.android.systemui  S 0  12345  6000 450000 1000000 S  0.0% 0.0% 0.0% Foreground

我们来分解这一列:

含义 示例值 说明
CPU% CPU 总使用率 100% 该进程及其所有线程占用的 所有 CPU 核心 的总使用率,如果你的设备是 8 核的,那么单个核心跑到 100% 也只显示 12.5%。
CPU% (单核) 单核 CPU 使用率 15% 该进程在 单个 CPU 核心 上的使用率,这个值在多核设备上更有参考价值,能看出进程是否在某个核心上疯狂占用。
PID 进程 ID 12345 系统中每个进程的唯一标识符。
Name 进程名 com.android.systemui 进程的名称,通常是应用的包名。
State 进程状态 S R (Running): 正在运行或准备运行。
S (Sleeping): 可中断的休眠状态(等待事件)。
D (Uninterruptible Sleep): 不可中断的休眠(通常在 I/O 操作)。
Z (Zombie): 僵尸进程(已结束但父进程未回收)。
VSS 虚拟内存集 0 进程虚拟地址空间的总大小,包括代码、数据、共享库等。这个值通常很大,参考意义有限
RSS 常驻内存集 6000 进程实际物理内存的占用大小(单位通常是 KB),这个值比 VSS 更能反映进程对内存的真实“压榨”程度。
PSS Proportional Set Size 450000 极其重要的内存指标,它将共享库的内存按比例地分摊到每个使用它的进程中。PSS = RSS1 + (共享库1大小 * 进程权重) + ...,这是衡量一个进程内存占用的 最公平、最准确 的指标。
USS Unique Set Size 1000000 进程独占的物理内存大小,这部分内存只有该进程能使用,即使进程被杀死,这部分内存也能被立刻回收,USS 是衡量进程自身内存消耗的最直接指标,但系统不直接提供此列,需通过 procrank 等工具查看。
PCY 调度优先级/类别 S 表示进程的调度类别。S 代表普通进程,F 代表前台进程,T 代表顶级进程(具有更高的优先级)。
THR 线程数 0% 该进程包含的线程数量。
#WQ 等待线程数 0% 等待 I/O 操作完成的线程数。
Name ( 进程名 Foreground 进程的名称,有时会显示更友好的描述。

常用交互式命令

top 命令的交互界面下,你可以按一些键来改变显示内容和行为:

android top 命令-图3
(图片来源网络,侵删)
命令 功能
q 退出 top 命令。
m 按内存排序,默认情况下,top 是按 CPU 使用率排序的,按 m 后会按 PSS(内存)从高到低排序,这对于查找内存大户非常有用。
s 刷新时间间隔,按 s 后可以输入一个数字来设置刷新间隔(单位为秒),例如输入 5,则每 5 秒刷新一次,按回车确认。
r renice 进程,重新设置某个进程的优先级,需要输入 PID 和优先级值(-20 到 19,值越小优先级越高),普通用户通常无法使用。
k 杀死进程,输入要杀死的进程 PID,然后输入信号(通常是 9 强制杀死)。
ds s 命令,设置刷新延迟。
o 添加/删除列,可以自定义显示哪些列。
f o 命令,字段编辑。
t 切换 CPU 列,在显示单个核心 CPU 使用率和所有核心总使用率之间切换。
p 切换进程/线程视图,在显示进程信息和线程信息之间切换。

实际应用场景

场景 1:定位 ANR (Application Not Responding) 问题

ANR 的根本原因是 主线程(UI 线程)被阻塞了超过 5 秒(按键事件)或 10 秒(输入事件)

  1. 当 ANR 发生时,设备通常会弹出对话框,不要点击任何东西。
  2. 在另一台电脑上,通过 adb shell top 连接设备。
  3. 查找你的应用包名(com.example.myapp)。
  4. 观察该进程的 State 列,如果它长时间处于 R (Running) 状态,CPU 使用率很高,说明它可能在执行一个耗时的计算任务。
  5. State 列是 S (Sleeping),但主线程就是没有被唤醒处理 UI 事件,那么问题可能出在某个 wait()lock() 调用上,导致线程无法继续执行。
  6. 结合 logcat 查看输出的 ANR trace 文件,可以精确定位到是哪一行代码阻塞了主线程。

场景 2:发现内存泄漏

内存泄漏是指对象不再被使用,但由于错误的引用关系,导致 GC(垃圾回收器)无法回收它们,从而造成内存占用持续增长。

  1. 启动你的应用。
  2. 在应用中执行一系列可能导致内存泄漏的操作(跳转页面、打开/关闭对话框等)。
  3. 在后台持续运行 adb shell top -m 20-m 表示只显示内存占用最高的前 N 个进程)。
  4. 观察你的应用进程的 PSS 值,正常情况下,在执行完操作后,内存应该会回落到一个稳定的基线水平,PSS 值只增不减,那么很可能存在内存泄漏。
  5. 结合 Android Studio 的 Memory Profiler,可以捕获内存快照,并通过比较快照来找出具体是哪些对象没有被回收。

场景 3:监控 CPU 占用率

如果发现设备发热严重或卡顿,可以查看是哪个进程占用了大量 CPU。

  1. 运行 adb shell top
  2. 默认按 CPU 使用率排序,找到占用率最高的进程。
  3. 如果是你的应用,说明它可能在后台执行了非常耗时的计算任务,或者存在性能瓶颈的代码(在主线程进行了网络请求、复杂的 UI 绘制、大量数据计算等)。

相关和替代命令

  • adb shell ps: top 的静态版本,只显示当前进程的快照,不刷新,用于一次性查看所有进程。
  • adb shell procrank: 一个更强大的内存分析工具,会显示每个进程的 USS (Unique Set Size),这是衡量进程自身内存消耗最准确的指标,但它在新版本的 Android 中可能已被移除。
  • adb shell dumpsys meminfo <package_name>: 极其重要的命令,它会打印出指定应用的详细内存信息,包括 PSS、对象数量、视图层次、已加载的类等,是分析内存问题的利器。
  • adb shell dumpsys cpuinfo: 查看 CPU 占用情况,可以按进程或服务分类统计。

top 命令是 Android 开发者必备的命令行工具之一,它简单、直接、高效,能让你快速掌握设备的运行状态,熟练掌握 top 的使用,特别是对 CPU%PSS 列的解读,将极大地提升你排查性能问题的能力。

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