Android 的 dumpsys 命令

我们都知道 Android 是基于 Linux 的操作系统,它默认的 Shell 是 Ash(见《Shell 脚本的简单介绍》),但这个显然不能满足 Android 的需求,所以 Google 开发了很多针对 Android 的命令行工具。

从 git 上把 Android 的源码 拉下来,会发现有一个 cmds 文件夹,里边放着的全是 Google 为 Android 开发的 shell 命令。其中 dumpsys${path}/frameworks/native/cmds/dumpsys 目录,感兴趣可以自行去研究。

执行 adb shell dumpsys,Android 就会把系统里边各种服务的状态 dump 出来。不同的 Android 版本提供的服务会有所不同,不同的 ROM 厂商也会定制自己的服务跑在系统里边。

我的手机小米 4C,MIUI 6.3.31 的系统(Android 5.1.1),Dump 出来的结果大概是这样子:

Currently running services:
  DisplayFeatureControl
  DockObserver
  MiuiBackup
  MiuiInit
  SurfaceFlinger
  accessibility
  account
  activity
  alarm
  android.security.keystore
  appops
  appwidget
  assetatlas
  audio
  backup
  battery
  batteryproperties
  batterystats
  bluetooth_manager
  clipboard
  connectivity
  content
  country_detector
  cpuinfo
  dbinfo
  device_policy
  devicestoragemonitor
  diskstats
  display
  dropbox
  fingerprint
  gfxinfo
  input
  input_method
  jobscheduler
  location
  lock_settings
  media.audio_flinger
  media.audio_policy
  media.camera
  media.player
  meminfo
  mount
  netpolicy
  netstats
  network_management
  notification
  package
  phone
  power
  procstats
  search
  sensorservice
  statusbar
  telecom
  textservices
  usagestats
  usb
  user
  vibrator
  wifi
  window
  ...

后面还有很长,紧接着会把每个服务的 dump 详细状况列举出来。可以看到有几个 Miuicom.xiaomi 开头的,这就是小米公司提供的服务,其他大部分是 Android 的标准服务。

为了方便查看,可以传一个参数来过滤多余的信息,比如 dumpsys meminfo 查看各个进程所占内存的情况。

下面介绍几个常用的 services,默认在 Android 的 shell 环境下执行。

account — 账号管理

就是 App 向 AccountManager 注册的账号,执行 dumpsys account,会列举出绑定的账号和各个 App 注册的 ServiceInfo。

devicestoragemonitor — 存储状态

执行 dumpsys devicestoragemonitor,主要显示磁盘的使用状况:

Current DeviceStorageMonitor state:
  mFreeMem=8.55 GB mTotalMemory=11.31 GB
  mFreeMemAfterLastCacheClear=8.55 GB
  mLastReportedFreeMem=8.55 GB mLastReportedFreeMemTime=-21m31s397ms
  mLowMemFlag=false mMemFullFlag=false
  mIsBootImageOnDisk=true  mClearSucceeded=false mClearingCache=false
  mMemLowThreshold=500 MB mMemFullThreshold=1.00 MB
  mMemCacheStartTrimThreshold=375 MB mMemCacheTrimToThreshold=750 MB

activity — Activity 相关组件的状态

这个命令支持子命令,通过 -h 可以看到子参数的列表:

dumpsys activity -h

输出:

Activity manager dump options:
  [-a] [-c] [-p package] [-h] [cmd] ...
  cmd may be one of:
    a[ctivities]: activity stack state
    r[recents]: recent activities state
    b[roadcasts] [PACKAGE_NAME] [history [-s]]: broadcast state
    i[ntents] [PACKAGE_NAME]: pending intent state
    p[rocesses] [PACKAGE_NAME]: process state
    o[om]: out of memory management
    prov[iders] [COMP_SPEC ...]: content provider state
    s[ervices] [COMP_SPEC ...]: service state
    package [PACKAGE_NAME]: all state related to given package
    all: dump all activities
    top: dump the top activity

这里非常值得一提的是 oom 参数,这里是指被踢出内存的优先级,也就是我们常说的进程优先级,值越小优先级越高,越不容易被杀,可以出现负数(系统 App 一般才会为负数,普通 App 最高为 0)。

也可以直接查看进程的优先级 oom_adj 的值:

cat /proc/${pid}/oom_adj

battery — 电池状态

dumpsys battery
Current Battery Service state:
  AC powered: false
  USB powered: true
  Wireless powered: false
  status: 5
  health: 2
  present: true
  level: 100
  scale: 100
  voltage: 4376
  temperature: 272
  technology: Li-poly

batterystats — 各应用耗电量信息

支持子命令,执行 dumpsys batterystats -h 查看参数列表:

Battery stats (batterystats) dump options:
  [--checkin] [--history] [--history-start] [--unplugged] [--charged] [-c]
  [--reset] [--write] [-h] [<package.name>]
  --checkin: format output for a checkin report.
  --history: show only history data.
  --unplugged: only output data since last unplugged.
  --charged: only output data since last charged.
  --reset: reset the stats, clearing all current data.
  --write: force write current collected stats to disk.
  <package.name>: optional name of package to filter output by.

alarm — Alarm 唤醒队列信息

查看放到定时队列中的事件。

cpuinfo — 各进程使用 CPU 信息

查看一段时间段内各个进程使用 CPU 的信息,包括 user、kernel 区分。

dbinfo — 各进程使用 SQLite 数据库的信息

查看各个进程使用数据库的状况,SQL 的执行时间等。

diskstats — 磁盘相关信息

dumpsys diskstats
Latency: 1ms [512B Data Write]
Data-Free: 8963580K / 11855028K total = 75% free
Cache-Free: 371304K / 380888K total = 97% free
System-Free: 299116K / 1889440K total = 15% free

dropbox — 各进程的 dropbox 日志信息

statusbar — 状态栏相关信息

usagestats — 每个界面启动的时间

meminfo — 各进程的内存使用状况

执行 dumpsys meminfo 查看每个进程占用 PSS 的列表。后面接 pid 或者包名可以查看具体某个进程的内存详细状况:

dumpsys meminfo com.eg.android.AlipayGphone

支付宝的内存详情
支付宝的内存详情

package — 查看安装信息

主要就是获取 AndroidManifest.xml 里边的信息。

window — 键盘、窗口和它们的关系

wifi — WiFi 信息

这个 log 太多了,比较难看明白。