赞
踩
dumpsys
属于android平台上的一个bin文件,放置在/system/bin 下面,主要完成打印系统服务的信息,帮助调试分析解决问题。
之前写的文章太长,感觉很难坚持看完,那么后续在写文章的时候,尽量讲的快一些,内容精简一些。
使用dumpsys -l 显示出来当前的服务列表。
我平时关注的是
surfaceflinger
activity
input``window
,因此可以通过
dumpsys
后面加入这些参数,来输出对应的信息。具体的可以手动操作下。
我们这节不讲
dumpsys
命令输出的每行的含义,我们讲讲
dumpsys
本身代码是怎么写的。
dumpsys源码位置:
frameworks/native/cmds/dumpsys
首先我们先看下这里的Android.mk,先看这个文件的目的是,我们要看下这个目录到底怎么组织,哪些文件参与编译,同时最终生成了什么内容,生成在哪里。
这里
LOCAL_SRC_FILES:
指定了参与编译的文件列表
LOCAL_SHARED_LIBRARIES
指定了依赖的动态库
LOCAL_MODULE
指定了编译出来的名字
include $(BUILD_EXECUTABLE)
指定了是个可执行文件,默认的位置在
system/bin
看完了这些,那我们找到源码
dumpsys.cpp
,来看下这个具体的代码。
因为最终编出来是可执行文件,那么标准的c程序,需要入口
main
方法的,这里我们看下
dumpsys
的
main
方法:(保留主要内容)
我们使用
defaultServiceManager
拿到
serviceManager
的
binder
客户端,然后调用它的
listServices()
拿到所有注册在
serviceManager
的服务列表,系统启动的时候,通过
serviceManager.addService
注册服务,这里
listServices()
拿到的就是这些服务列表。我们这里拿WMS做个例子,系统在
SystemServer.java
启动的时候,使用:
将window服务注册进去。
然后这里拿到服务列表后,遍历列表,调用
service->dump(remote_end.get(), args);
,这里使用了
pipe
管道,将输出文件传递过去。
这里dump调用的是每个binder服务的dump,比如WMS就是
WindowManagerService.java
,这里有个dump方法:
我们发现和我们 本身传入的参数不一样,我们本身传入的为
service->dump(remote_end.get(), args)
,这里系统帮我们隐藏了binder的具体关联,这里我们直接调用的dump方法,在binder.java里面:
通过将文件句柄,进行包装,再次调用本身的dump(三个参数),这里就会执行对应服务的dump方法了,比如WMS就是
WindowManagerService.java
的dump:
如上,便完成了dumpsys的代码整个流程。
推荐阅读:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。