首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >android dumpsys 快速入门

android dumpsys 快速入门

作者头像
用户1263308
发布2018-02-02 11:15:56
8660
发布2018-02-02 11:15:56
举报
文章被收录于专栏:代码GG之家代码GG之家

dumpsys属于android平台上的一个bin文件,放置在/system/bin 下面,主要完成打印系统服务的信息,帮助调试分析解决问题。

之前写的文章太长,感觉很难坚持看完,那么后续在写文章的时候,尽量讲的快一些,内容精简一些。 使用dumpsys -l 显示出来当前的服务列表。 我平时关注的是 surfaceflinger activity inputwindow,因此可以通过 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方法的,这里我们看下 dumpsysmain方法:(保留主要内容)

我们使用 defaultServiceManager拿到 serviceManagerbinder客户端,然后调用它的 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的代码整个流程。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-11-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 代码GG之家 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档