dumpsys 工具入门:命令格式、权限与常用子命令

dumpsys 这个名字,我第一次听到的时候觉得挺唬人。后来发现,它其实就是系统服务的“窥探器”。你想知道 ActivityManager 在忙什么?WindowManager 当前焦点在哪?内存到底谁在吃?一条命令下去,服务内部的状态直接就吐出来了。

我个人习惯,在接到性能问题的时候,第一件事不是开 Profiler,而是先敲两下 dumpsys。因为它的反馈是最“原生态”的,没有采样偏差,也没有额外开销。说白了,它就是系统的“直连诊断接口”。

核心理解:dumpsys 是 Android 系统内置的工具,用于转储(dump)系统服务(System Service)的运行状态信息。它是对 Systrace 等工具的重要补充,适合做 静态状态分析 和 事后快照分析。

dumpsys 命令格式与权限

格式很简单,但有一些细节容易踩坑。先看骨架:

adb shell dumpsys [service_name] [options]

去掉 [service_name],它会输出所有服务的信息。我建议你千万别在生产环境这样干,信息量太大,终端直接就刷屏了。我之前在调试一台低端设备时这么干过,结果 adb 直接卡住,等了快两分钟才缓过来。

参数 说明 我见过的问题
无参数 列出所有服务名称 信息量太大,容易看花眼
service_name 转储指定服务的状态 权限不足时可能返回空结果
--help 查看该服务支持哪些子参数 有些旧版 ROM 不支持此选项

权限要求:在 user 版本手机上,部分敏感服务需要 android.permission.DUMP 权限。普通第三方应用拿不到。怎么办?我通常会做两件事:

  • 用 adb shell dumpsys,因为 adb 本身具备 shell 权限
  • 如果遇到 SecurityException,考虑使用 root 权限或刷 userdebug 镜像

避坑指南:我曾经在用户版本的手机上调试一个第三方应用的 ANR 问题,结果 dumpsys activity processes 直接报权限拒绝。后来发现,必须用 adb shell 执行,而不是用 Runtime.exec() 在应用内调用。

常用子命令详解

下面这六个子命令,是我排查性能问题时最常用的。按使用频率从高到低排列:

1. meminfo – 内存分析第一站

adb shell dumpsys meminfo [package_name]

它会告诉你一个进程的 PSS(按比例分摊的物理内存)、Private Dirty、Heap Size 等关键指标。我个人习惯先用这个命令“瞄一眼”,看看是不是内存泄漏。如果一个进程的 PSS 持续上涨,那基本可以判断有问题。

2. cpuinfo – CPU 时间都去哪了

adb shell dumpsys cpuinfo

输出的是各个进程的 CPU 占用率。注意,它显示的是 整体 CPU 时间片,不是瞬时值。我曾经用它抓到一个后台定位服务吃掉 30% CPU 的案例,那时候开发者还坚持说“地理围栏很省电”……嗯,数据不会骗人。

3. gfxinfo – 帧渲染质量检查

adb shell dumpsys gfxinfo [package_name]

这个命令输出每一帧的绘制时间,包括 Draw、Prepare、Process、Execute 四个阶段。我最常用的是看 TotalFrameCount 和 JankyFrames 这两个字段。如果卡顿率超过 10%,那就需要深入分析了。

4. batteryinfo – 谁说电量没问题?

adb shell dumpsys batteryinfo [package_name]

输出一个应用的电量消耗明细,包括唤醒锁(WakeLock)、网络活动、传感器使用等。我在帮合作伙伴优化一个 IM 应用时,发现它每 30 秒请求一次位置更新,导致后台耗电量异常高。dumpsys batteryinfo 直接锁定了问题。

5. activity – 界面栈与生命周期

adb shell dumpsys activity activities
adb shell dumpsys activity processes

activities 显示 Activity 栈的层级关系,processes 显示当前进程的状态。当怀疑界面跳转异常或进程被提前回收时,这个命令特别好用。

6. window – 窗口焦点与 Input 通道

adb shell dumpsys window

输出当前窗口的层级信息、焦点状态、Input 通道是否堵塞等。我遇到过一个黑屏问题,就是靠 dumpsys window 看到 SurfaceFlinger 没有收到窗口输入的信号,从而定位到是 Surface 创建失败的。

小技巧:用 dumpsys window policy 可以快速查看当前的焦点窗口,比 dumpsys window displays 更直接。

知识结构总览

下面这张图概括了 dumpsys 在性能调试流程中扮演的角色。你可以看到,它既独立工作,也能为 Systrace 等工具提供线索。

dumpsys 在性能调试中的位置 adb shell 输入 系统服务集合 权限检查 常用子命令组 meminfo cpuinfo gfxinfo batteryinfo activity window 输出分析方向 内存泄漏 / OOM 分析 帧卡顿 / 渲染瓶颈 ANR / 焦点异常 与 Systrace 联合分析 定位根因,给出优化方案

你使用 dumpsys 获取静态快照,然后带着这些线索切到 Systrace 看时间线,这就是两者联合的精髓。我个人觉得,记下这张图就够用了——先把 dumpsys 当成系统状态的“CT 扫描仪”,等扫出病变位置,再用 Systrace 那个“显微镜”去放大看细节。