android dumpsys 快速入门
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
方法的,这里我们看下 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的代码整个流程。
- 数据库中间件 MyCAT 源码解析 —— 分片结果合并(一)
- 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 路由(一)之分库分表配置
- 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 解析(六)之删除SQL
- 数据库[分库分表]中间件 Sharding-JDBC 源码分析 —— SQL 解析(五)之更新SQL解析
- ExtJs+WCF+LINQ实现分页Grid
- 数据库[分库分表]中间件 Sharding-JDBC 源码分析 —— SQL 解析(四)之插入SQL
- 基于sliverlight + wcf的web 文字版IM 示例
- 数据库中间件 Sharding-JDBC 源码分析 —— SQL 解析(三)之查询SQL
- zephir-(11)流程控制语句
- phalcon-入门篇7(Model层基础使用)
- Sharding-JDBC 源码分析 —— SQL 解析(二)之SQL解析
- zephir-(1)开篇介绍
- phalcon-入门篇6(控制器)
- phalcon-入门篇5(请求与返回)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Python装饰器
- 3分钟短文:十年窖藏,Laravel告诉你表单验证的“正确姿势”
- 面试官:说说SpringBoot中Spring容器的启动过程
- Python IO
- Python解析式
- 面试官:Tomcat 的调优怎么做?你的最佳实践有哪些?
- Tomcat源码分析
- lazy-mock ,一个生成后端模拟数据的懒人工具
- Python拉链法和开地址法实现字典
- Springboot2 整合redis发布订阅 解决订阅多个频道重复代码过多 创建很多bean问题
- 爬虫选择器算法漫谈
- Java 类加载机制及双亲委派模型
- Python函数
- Effective C++条款3 我可以不使用const?
- t想成为微信斗图之王么?你需要这款开源工具的力量!