1. 什么是dumpsys
The dumpsys tool runs on the device and provides information about the status of system services.
dumpsys这个工具可以查看当前设备系统服务信息。
2. 如何使用dumpsys
如果你直接运行adb shell dumpsys的话,会得到所有系统服务的输出,输出结果比你想要的多得多。为了控制输出内容,需要指定想要查看的服务。如:
$ adb shell dumpsys input
3. dumpsys能查看的信息有那些
用下面的命令可以列出所支持查看的系统服务
$ adb shell dumpsys -l
Currently running services:
DockObserver
SurfaceFlinger
accessibility
account
activity
alarm
…
常用命令举例:


不同服务可以跟不同的命令选项,以activity为例:

获取Activity信息:
adb shell dumpsys activity
加上-h可以获取帮助信息
获取当前界面的activity详情,可以用:
adb shell dumpsys activity top
(控件都看得到)
对了,还有一种情况,就是当前界面是一个activity动态加载的fragment的话,这时候就算知道了activity也对应不上界面的内容,不过这时候还是可以用这个命令,去看输出结果的Fragment关键字,排在最上面的就是当前界面对应的Fragment。
要获取当前界面的Activity(结果显示的是最顶层的activity,但activity可能不是当前界面上的最顶层,自行体会):
adb shell dumpsys activity top | findstr ACTIVITY
这个其实就是把上面命令的结果过滤一下只显示第一行
(findstr不可用的话用grep)
最近activity:

获取电源管理信息:
adb shell dumpsys power
可以获取到是否处于锁屏状态:mWakefulness=Asleep或者mScreenOn=false
亮度值:mScreenBrightness=255
屏幕休眠时间:Screen off timeout: 60000 ms
屏幕分辨率:mDisplayWidth=1440,mDisplayHeight=2560
wake lock:Wake Locks:size =

GsmConnection是一个tag,在new wake_lock的时候自行定义,通过pid可以确定其所在的服务进程。
查看手机telephony状态:
可以看网络注册状态,数据链接状态,是否漫游,信号强度,等等,参数我就不一一解毒了,跟android系统版本也有关系
查看notification:
adb shell dumpsys notification
查看是由哪个应用发出的通知。比如你用着手机的时候出来一个神烦的广告,但是你却不知道它是哪个应用弹出的,那去卸载哪个应用呢?

我们截图输出结果的一部分
NotificationRecord(0x01b93b62: pkg=com.tencent.mobileqq user=UserHandle{0} id=121 tag=null score=0 key=0|com.tencent.mobileqq|121|null|10125: Notification(pri=0 contentView=null vibrate=null sound=null tick defaults=0x0 flags=0x11 color=0x00000000 vis=PRIVATE))
uid=10125 userId=0
icon=Icon(typ=RESOURCE pkg=com.tencent.mobileqq id=0x7f0204bf) / com.tencent.mobileqq:drawable/name
pri=0 score=0
key=0|com.tencent.mobileqq|121|null|10125
seen=true
groupKey=0|com.tencent.mobileqq|121|null|10125
contentIntent=PendingIntent{bc254f3: PendingIntentRecord{e9265b0 com.tencent.mobileqq startActivity}}
deleteIntent=PendingIntent{5711c29: PendingIntentRecord{873abae com.tencent.mobileqq broadcastIntent}}
tickerText=Flour_Mo(MoKee Project):[挖鼻孔]
比较关键的是contentIntent和deleteIntent,这两个类型都是PendingIntent。注意这里能看到的是应用的包名,并不能看到点击后会跳转到哪个activity(大家代码都会混淆的好嘛,想看也看不到吧)。
查看SurfaceFlinger:
adb shell dumpsys SurfaceFlinger

用来查看当前界面上有几个frame,分别的源是什么。
查看wifi信息(连接记录):
adb shell dumpsys wifi
这个厉害了,可以看看他/她有没有连过闺蜜/老王加的wifi!

最后一个乱码,因为是中文wifi,不过后面也可以看到中文名

可以看到很多信息的,自己去发掘吧(密码没有,要看密码去看系统文件吧)。
4. 使用到dumpsys的案例
4.1 接听视频来电屏幕会休眠
一般来说,处于视频电话的时候,屏幕应该保持常亮的,这样才能方便用户查看视频内容。
问题出现的时候根据以往的经验,知道这很有可能是某个wake_lock没有申请到,比较MO和MT的wake_lock看到:
adb shell sumpsys power

Mt端少了SCREEN_BRIGHT_WAKE_LOCK,而它在PowerManager.java中的定义正是:

直接搜关键字SCREEN_BRIGHT_WAKE_LOCK没有在InCallUI,Telecomm,Telephony搜到相关的wake_lock类型,但是我们看到这个wake_lock和FLAG_KEEP_SCREEN_ON有联系,多数应用都是用的这个flag,那么我们再搜这个关键字的收,就在InCallUI中找到了出问题的地方,找到问题了就好改啦~
4.2 设置双卡询问,弹出的dialog属于Dialer还是InCallUI
双卡手机在设置了拨号前每次询问的时候,会弹出一个dialog(当然也有厂家定制的在拨号盘上之间诶选择),我们的入口是Dialer,而通话界面属于InCallUI,那这个选择SIM卡的dialog属于谁?
用下面的命令可以查看

如果你觉得这个方法不是那么有必要,那你应该还没有遇见过没title没内容的dialog/斜眼笑
还有这个方法适合于大多数场景,但也有例外。比如这个顶层界面(不一定是dialog)上的东西不是从Activity中显示出来的,(纳尼哦?!居然有这种事?!)这时候可以尝试用adb shell dumpsys SurfaceFlinger
,这个命令可以查看界面是由哪些内容绘制的(想知道原理的可以去看SurfaceFlinger机制)

上图的信息显示,当前界面有状态栏,导航栏,还有一个联想的com.lenovo.ideafriend/com.lenovo.ideafriend.alias.DialtactsActivity,那状态栏和导航栏都很好认,界面上剩下的就是那个DialtactsActivity了。
感谢阅读。