菜鸟科技网

dumpsys命令如何查看系统服务详情?

什么是 dumpsys

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

dumpsys命令如何查看系统服务详情?-图1
(图片来源网络,侵删)

你可以把它想象成是在对 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 命令来分析。

dumpsys命令如何查看系统服务详情?-图2
(图片来源网络,侵删)
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 是获取这些信息的直接方式。

dumpsys命令如何查看系统服务详情?-图3
(图片来源网络,侵删)
# 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 的完整类名。

注意事项

  1. 需要 Root 权限吗?

    • 大部分 dumpsys 命令不需要 Root 权限,因为它们只是读取公开的系统服务信息。
    • 但某些敏感信息(如精确的 CPU 时间分配)可能需要 Root 权限才能获取完整数据。
  2. 性能影响

    • dumpsys 本身对系统性能影响很小。
    • dumpsys 不带任何参数会触发所有服务进行一次“快照”,在低端设备上可能会造成短暂的卡顿。始终尽量指定你想要查询的服务
  3. 可能因版本而异

    • 不同 Android 版本(如 Android 10, 11, 12, 13)的系统服务实现可能不同,导致 dumpsys 的输出格式或包含的字段有所变化,在调试时,要注意你的目标 Android 版本。

dumpsys 是 Android 开发者和测试工程师的瑞士军刀,熟练掌握它,能让你在遇到问题时,不再仅仅依赖 Logcat,而是能够深入到系统层面,快速定位和分析问题的根源,建议你从最常用的 activity, window, meminfo, cpuinfo 开始练习,逐步将其融入你的日常调试工作中。

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