Android 一些有意思的命令小工具 —— dumpsys
更新日期:
android 自带了很多 cmds 的小工具,都挺用有的,也有些比较有意思。这里介绍的是 dumpsys 这个工具。说之前先把相关源码位置说下(4.4 的):
|
|
作用
这个工具的作用是让你能够在 shell 中 dump(导出)系统服务(SS)的当前状态,然后输出到 console 中。不过都能输出到 console 中,重定向一下,就能输出到文件中啦,这个工具是非常有用的。用法很简单直接敲 dumpsysy 就行了。不过这样是导出所有实现了 dump 接口的 SS 的状态(基本上 SS 都实现了这个接口),然后输出非常的长,类似下面这样:
|
|
虽然说可以用搜索,但是太长了还是比较麻烦,可以在接某个(或是几个) SS 的名字,就可以导出指定 SS 的当前状态。例如说像下面这样:
|
|
这样就能导出你想看的 SS 的当前状态。稍微注意一下,这里 SS 的名字是注册到 SM 中的那个名字,Binder 篇的时候介绍过了一般不是带包名类名的那个,而是短的那个。具体的可以去翻源代码,或者可以先:
|
|
这样会罗列出所有的 SS 的名字(这个 -l 参数是 4.4 才加的,之前的直接 dumpsys 在一开始也会列出所有的 SS 的名字),然后复制、粘贴一下就行了。
分析
这个小工具的作用和基本用法知道了,然后我们看看实现(代码不长我直接全贴了):
|
|
从上面的代码可以看到这个工具是通过 SM 获取 SS 的 IBinder 接口的。SM 主要是 native 的层,所以 native 应用要调用也挺方便。然后导出的内容主要是调用 IBinder 的 dump 接口。IBinder 直接留有 dump 这个抽象接口,所以从 Binder 设计开始,android 就想要要留个东西方便调试(查看当前 SS 的状态):
|
|
然后 native 的 Bn 有默认实现:
|
|
接下去是 java 层的:
|
|
从 dumpsys 通过 native 的 IBinder 一直调用到 java 层的 Binder dump,到 java 的 Binder 有一个同名但是参数不一样的抽象函数。多了的一个参数是 java io 的 PrintWriter,我对这个不是很熟悉(好像是可以控制可以输出到哪去的),所以在这里不讨论这个。然后其实导出什么东西,具体是由不同的 SS 来实现的。我们拿 AMS 来看一下:
|
|
这里我们不具体看 AMS 导出了什么东西(AMS 的数据结构一大票,所以能导出很多东西的),但是从代码中发现,其实 dumpsys 还可以传不同的参数给不同的 SS。例如上面的 AMS 有 -c、-h 的参数。从上面 dumpsys 代码中发现,只有指定 SS 的命令格式才能接特定的参数,例如说这样:
|
|
全部导出的不支持的(默认给你加了 -a),这个是因为不同的 SS 说支持的参数不一样(完全由各个 SS 实现决定),所以只有指定 SS 才能接参数。至于哪些 SS 支持哪些参数,具体的去看 SS 的 dump 实现代码去吧。然后说一点如果自己改某些 SS ,例如说加了某些字段,可以在 dump 中把这些字段也导出来了,这样调试自己加的功能的时候会方便不少。
总结
dumpsys 这个工具最大的作用在于,可以直接打印(导出到文件)所有(指定)SS 的一些预先写好的状态,对于调某些问题的时候,可以通过这个工具查看到当前 SS 中一些数值的信息,这样可以不用额外加打印就能追踪到一些现象中的 SS 的某些状态。所以对于某些重启现象就消失的情况,这个工具是非常管用的。