什么是 dumpsys?
dumpsys 是一个 Android 命令行工具,它位于 Android 系统的 /system/bin/ 目录下,它的核心功能是请求系统服务(System Service)输出其内部状态、配置信息和运行时数据,并以易于阅读的格式返回。

你可以把它想象成是在对 Android 系统中的各个“部门”(系统服务)进行“盘问”,每个“部门”都会交出自己当前的工作报告。
基本语法和工作原理
语法
adb shell dumpsys [service_name] [options]
参数说明
adb shell: 这是执行命令的前提,表示通过 ADB(Android Debug Bridge)进入设备的 Shell 环境。dumpsys: 核心命令。[service_name](可选): 你想查询的特定系统服务的名称,如果不指定这个参数,dumpsys会请求所有已知的系统服务并输出它们的信息,这通常会产生非常长的输出。[options](可选): 一些服务支持特定的选项,用于过滤或格式化输出。
工作原理
Android 系统中的核心服务(如 ActivityManager, WindowManager, PackageManager 等)都继承自基类 Binder,这使得它们可以跨进程通信。dumpsys 命令通过 ADB 发送一个特定的 dump 请求给 ActivityManagerService(AMS),AMS 作为系统服务的“大管家”,再将这个请求分发给其他相应的服务,每个服务接收到请求后,会调用其内部的 dump() 方法,将自身的状态信息写入到一个 Printer 对象中,最终由 AMS 收集并返回给 ADB 客户端,也就是你的电脑终端。
如何使用 dumpsys (核心用法)
1 查看所有服务信息
如果你想了解系统的整体概览,可以不带任何参数运行。
adb shell dumpsys
警告: 这个命令的输出会非常非常长,通常有几千甚至上万行,在终端里直接查看可能会卡住,一般建议将输出重定向到一个文件中,然后用文本编辑器或 grep 命令来分析。

adb shell dumpsys > dumpsys_all.txt
2 查看特定服务信息
这是最常见的用法,你需要知道目标服务的名称,以下是一些最常用和最重要的服务:
| 服务名称 | 主要用途 | 示例命令 |
|---|---|---|
activity |
活动管理器,负责管理 Activity、进程、任务栈等,调试 UI、ANR (Application Not Responding) 的首选。 | adb shell dumpsys activity |
window |
窗口管理器,负责管理所有窗口的层级、布局、输入焦点等,查看 UI 布局、层级关系的利器。 | adb shell dumpsys window |
meminfo |
内存信息,查看指定应用的内存占用情况,包括 Java 堆、Native 堆、栈、缓存等。 | adb shell dumpsys meminfo <package_name>adb shell dumpsys meminfo <pid> |
cpuinfo |
CPU 信息,查看各个进程的 CPU 占用情况。 | adb shell dumpsys cpuinfo |
power |
电源管理器,查看设备的唤醒锁、屏幕状态、电池信息等。 | adb shell dumpsys power |
battery |
电池信息,查看电池健康状态、电压、温度、当前等。 | adb shell dumpsys battery |
package |
包管理器,查看已安装应用的详细信息,如包名、版本号、签名、权限、组件等。 | adb shell dumpsys package <package_name> |
SurfaceFlinger |
Surface 合成器,负责将所有窗口的 Surface 合成并显示到屏幕上,调试图形渲染问题。 | adb shell dumpsys SurfaceFlinger |
media.player |
媒体播放器,查看当前播放的音频/视频信息、播放状态、音量等。 | adb shell dumpsys media.player |
3 查看特定服务并过滤输出
当服务信息依然很多时,可以使用 grep 命令来过滤你关心的内容。
# 查看当前正在运行的活动
adb shell dumpsys activity | grep "Run #"
# 查看某个应用的内存信息,并过滤出 TOTAL 那一行
adb shell dumpsys meminfo com.example.myapp | grep "TOTAL"
# 查看所有 CPU 占用率超过 10% 的进程
adb shell dumpsys cpuinfo | grep -E ' [0-9]{1,2}\.[0-9]% '
4 查看特定服务并指定选项
一些服务支持特定的选项,最常用的是 --help。
# 查看某个服务的帮助信息,了解它支持哪些选项 adb shell dumpsys activity --help # activity 服务支持查看特定任务的详细信息 adb shell dumpsys activity top
实战场景与示例
场景1:应用卡顿或 ANR 调试
当应用无响应时,ANR 日志会记录下关键信息。dumpsys 是获取这些信息的直接方式。

# 1. 获取 ANR 发生时的详细信息,特别是 activities 和 cpuinfo adb shell dumpsys activity | grep ANR adb shell dumpsys activity top adb shell dumpsys cpuinfo # 2. 查看关键进程(如你的应用进程)的堆栈信息 adb shell dumpsys activity top | grep "ACTIVITY" # 得到你的包名和进程号后,查看堆栈 adb shell dumpsys activity top | grep "TOP-OR-SUCCESSFUL-INTENT" # 然后使用 `adb shell top -H -p <pid>` 查看线程的详细 CPU 占用和堆栈
场景2:UI 布局问题
你想知道当前屏幕上某个 View 的坐标、尺寸、层级等信息。
# 1. 首先获取你的应用的根窗口
adb shell dumpsys window windows | grep <your_package_name>
# 2. 找到类似 `mSurface=...` 的 token,`Window{... token=abc123}`
# 3. 使用这个 token 查看更详细的布局信息
adb shell dumpsys window windows | grep "Window{.* token=abc123}" -A 20
更简单的方式是使用 Android Studio 的 Layout Inspector,但 dumpsys window 在命令行环境下非常有用。
场景3:内存泄漏排查
怀疑应用存在内存泄漏,需要监控其内存使用情况。
# 1. 启动应用前,先记录一下系统的空闲内存 adb shell dumpsys meminfo | grep "MemTotal\|MemFree" # 2. 操作应用,进入你认为可能泄漏的页面,然后退出该页面 # 3. 再次查看应用的内存占用,看它是否没有正常释放 adb shell dumpsys meminfo com.example.myapp # 观察其中的 `Pss` (Proportional Set Size) 数据,它比 `Private Dirty` 更能真实反映内存占用。
场景4:检查应用是否被授予某个权限
adb shell dumpsys package <package_name> | grep "requested=" # 或者更精确地 adb shell dumpsys package <package_name> | grep "android.permission.CAMERA"
输出格式与解析
dumpsys 的输出通常是键值对格式,结构化程度很高。
KEY:或KEY = VALUE: 表示一个属性。- 通常表示一个列表项或子项的开始。
- 表示更深一层的嵌套。
- 分隔线,用于区分不同的部分。
示例解析 dumpsys activity 的一部分:
ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)
...
Running activities (most recent first):
TaskRecord{4e3b0f8 #1 A=com.example.myapp U=0 sz=1}
Run #0: ActivityRecord{4e3c1a8 u0 com.example.myapp/.MainActivity t#1}
mIntent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.example.myapp/.MainActivity}
mStackId=0
...
Running activities: 表示接下来显示的是正在运行的活动。TaskRecord{...}: 表示一个任务栈。ActivityRecord{...}: 表示一个 Activity。u0: 表示用户 ID 为 0 (主用户)。com.example.myapp/.MainActivity: 表示这个 Activity 的完整类名。
注意事项
-
需要 Root 权限吗?
- 大部分
dumpsys命令不需要 Root 权限,因为它们只是读取公开的系统服务信息。 - 但某些敏感信息(如精确的 CPU 时间分配)可能需要 Root 权限才能获取完整数据。
- 大部分
-
性能影响
dumpsys本身对系统性能影响很小。dumpsys不带任何参数会触发所有服务进行一次“快照”,在低端设备上可能会造成短暂的卡顿。始终尽量指定你想要查询的服务。
-
可能因版本而异
- 不同 Android 版本(如 Android 10, 11, 12, 13)的系统服务实现可能不同,导致
dumpsys的输出格式或包含的字段有所变化,在调试时,要注意你的目标 Android 版本。
- 不同 Android 版本(如 Android 10, 11, 12, 13)的系统服务实现可能不同,导致
dumpsys 是 Android 开发者和测试工程师的瑞士军刀,熟练掌握它,能让你在遇到问题时,不再仅仅依赖 Logcat,而是能够深入到系统层面,快速定位和分析问题的根源,建议你从最常用的 activity, window, meminfo, cpuinfo 开始练习,逐步将其融入你的日常调试工作中。
