Ddd2cde39de6a8ee7a007cf20e9f1e2f
Android Detail:工具篇 —— Android 世界的活点地图 dumpsys

前言

你好,很高兴见到你!👋

你是否遇到过以下场景

  • 需要快速定位当前界面是哪个 Activity
  • 需要知道系统内当前 Activity 的任务栈和返回栈状态
  • 查看当前设备的内存分配
  • 快速查看上一次发生 ANR 的时间以方便定位问题
  • 快速查看当前应用 Context 和 Activity 数量以快速确定发生内存泄漏的 Activity 对象
  • ...

这些场景均可用使用 dumpsys 命令搞定!

阅读本文,您将了解以下内容:

  • dumpsys 是什么?
  • dumpsys 常用语法
  • dumpsys 原理
  • dumpsys 的使用技巧(快速定位 Activity 和 Fragment)
  • 记不住冗长的命令?介绍一款「威力巨猛」的工具 😉

dumpsys 是什么?

dumpsys 是一种在 Android 设备上运行的工具,可提供有关系统服务的信息。—— 官方文档

它就像 Android 世界的「活点地图」(《哈利波特》中的魔法地图),是一个非常强大的神兵利器。

dump(作为计算机的术语翻译为转储),sys(system)。我们可以通过 adb 调用该命令以获取系统服务信息。

👆 为了方便记忆,可用这样理解 dump

作为 动词,可以从 dump 的目的和 dump 的对象这两个方面去理解 dump 本身。

1、为什么要 dump(dump 的目的)?

因为程序在计算机中运行时,在内存、CPU、I/O等设备上的数据都是动态的(或者说是易失的),也就是说数据使用完或者发生异常就会丢掉。如果我想得到某些时刻的数据(有可能是调试程序 Bug 或者收集某些信息),就要把他转储(dump)为静态(如文件)的形式。否则,这些数据你永远都拿不到。

2、dump 转储的是什么内容(dump 的对象)?

其实上边已经提到了,就是将动态(易失)的数据,保存为静态的数据(持久数据)。像程序这种本来就保存在存储介质(如硬盘)中的数据,也就没有必要dump。

现在,dump作为 名词 也很好理解了,一般就是指 dump(动词) 的结果文件。

以上来自 知乎 Freeman 的回答

dumpsys 常用语法

adb shell dumpsys [-t timeout] [--help | -l | --skip services | service [arguments] | -c | -h]

下表列出了使用 dumpsys 时的可用选项。

选项 说明
-t timeout 指定超时期限(秒)。如果未指定,默认值为 10 秒。
--help 输出 dumpsys 工具的帮助文本。
-l 输出可与 dumpsys 配合使用的系统服务的完整列表。
--skip services 指定您不希望包含在输出中的服务。
service [arguments] 指定您希望输出的服务。某些服务可能允许您传递可选参数。您可以通过将 -h 选项与服务名称一起传递来了解这些可选参数,如下所示:adb shell dumpsys procstats -h
-c 指定某些服务时,附加此选项能以计算机可读的格式输出数据。
-h 对于某些服务,附加此选项可查看该服务的帮助文本和其他选项。

dumpsys 原理

dumpsys 命令源码来自 frameworks/native/cmds/dumpsys/dumpsys.cpp

sm_

sm_

dump 输出信息

dump 输出信息

dumpsys 主要做了以下几件事:

  • 获取 ServiceManager 对象 sm_
  • 使用 sm_listService() 获取系统所有向 ServiceManager 注册过的服务
  • 使用 sm_checkService() 获取指定服务
  • 调用 service 远程服务中的 dump() 方法输出相应的信息

简单来讲,dumpsys 通过用户输入命令中的 service 名称,使用 checkService() 获取指定 service ,并调用其远程服务中的 dump() 方法来输出相应的信息。

👆 划重点

例如 adb shell dumpsys activity activities

👆 service 名称为 activity ,输出 ActivityManagerService 相关的信息,参数 activities 表示显示 activity 状态

dumpsys 的使用技巧

常用的 service

常用的 service 名称有:

dumpsys activity //查询AMS服务相关信息
dumpsys window //查询WMS服务相关信息
dumpsys cpuinfo //查询CPU情况
dumpsys meminfo //查询内存情况

adb shell dumpsys -l 命令能够输出可与 dumpsys 配合使用的系统服务的完整列表。

adb shell dumpsys -l

adb shell dumpsys -l

详情如下:

服务名 类名 功能
activity ActivityManagerService AMS相关信息
package PackageManagerService PMS相关信息
window WindowManagerService WMS相关信息
input InputManagerService IMS相关信息
power PowerManagerService PMS相关信息
batterystats BatterystatsService 电池统计信息
battery BatteryService 电池信息
alarm AlarmManagerService 闹钟信息
dropbox DropboxManagerService 调试相关
procstats ProcessStatsService 进程统计
cpuinfo CpuBinder CPU
meminfo MemBinder 内存
gfxinfo GraphicsBinder 图像
dbinfo DbBinder 数据库
服务名 功能
SurfaceFlinger 图像相关
appops app使用情况
permission 权限
processinfo 进程服务
batteryproperties 电池相关
audio 查看声音信息
netstats 查看网络统计信息
diskstats 查看空间free状态
jobscheduler 查看任务计划
wifi wifi信息
diskstats 磁盘情况
usagestats 用户使用情况
devicestoragemonitor 设备信息

该表来自 Gityuan 博客

top Created with Sketch.