![2ee660d181143ea713c27aabb69f2071.png](https://img-blog.csdnimg.cn/img_convert/2ee660d181143ea713c27aabb69f2071.png)
1.概述
dumpsys是android系统里面的一个可执行文件。从名字来看,其主要作用是将当前android系统的一些信息dump出来,如activity、package等。
dumpsys是一个分析android设备问题、查看运行状态、使用情况等十分有效的工具。
查看所有支持的dump选项:
dumpsys -l #此命令会将当前android系统所有运行的服务全部列出来
比如我们想获取当前系统所有的activity信息:
dumpsys activity
2.dumpsys命令
前面介绍了android系统服务查询,dumpsys命令的基本组成方式为: dumpsys serviceName,同时你还可以加如下参数:
-h:对于大多数的服务,可以添加-h看到文本的帮助-c:对于一些服务,可以添加-c查看数据会更友好exsample: “dumpsys meminfo -h”:meminfo dump options: [-a] [-d] [-c] [-s] [--oom] [process] -a: include all available information for each process. -d: include dalvik details. -c: dump in a compact machine-parseable representation. -s: dump only summary of application memory usage. -S: dump also SwapPss. --oom: only show processes organized by oom adj. --local: only collect details locally, don't call process. --package: interpret process arg as package, dumping all processes that have loaded that package. --checkin: dump data for a checkinIf [process] is specified it can be the name or pid of a specific process to dump.
下面我们看一些常见的命令组合。
package信息查询
命令格式:dumpsys package [-h] [-f] [--checkin] [cmd] ...
![37cf13f6cb37fca8961a805f2d8ad068.png](https://img-blog.csdnimg.cn/img_convert/37cf13f6cb37fca8961a805f2d8ad068.png)
子命令举例:
- dumpsys package prov[iders]:获取content providers
- dumpsys package p[ackages]:获取安装包基本信息
- dumpsys package s[hared-user]:获取共享用户ID的应用
- dumpsys package m[essages]:打印运行时收集的信息
- dumpsys package r[esolvers]:获取intent filter
activity信息查询
命令格式:dumpsys activity [-a] [-c] [-p PACKAGE] [-h] [WHAT] ...
![761ff75679da0234548be7e34df4473f.png](https://img-blog.csdnimg.cn/img_convert/761ff75679da0234548be7e34df4473f.png)
子命令举例:
- dumpsys activity a[ctivities]:activity堆栈状态
- dumpsys activity r[recents]:最近activity的状态
- dumpsys activity o[om]:oom管理
- dumpsys activity top:栈顶的activity
- dumpsys activity all:所有的activity
网络信息查询
![b141e72ba9ff5ba8ecadbc4874d3e00c.png](https://img-blog.csdnimg.cn/img_convert/b141e72ba9ff5ba8ecadbc4874d3e00c.png)
其他常用服务信息查询
![8a140595158e5b2e514b698e257c6c29.png](https://img-blog.csdnimg.cn/img_convert/8a140595158e5b2e514b698e257c6c29.png)
3.实现逻辑
dumpsys的源码结构其实很简单,只有一个dumpsys.cpp,源码路径:frameworks/native/cmds/dumpsys/dumpsys.cpp
int main(int argc, char* const argv[]){ signal(SIGPIPE, SIG_IGN); sp sm = defaultServiceManager(); //get ServiceManager object ... if (services.empty() || showListOnly) { // gets all services services = sm->listServices(); services.sort(sort_func); args.add(String16("-a")); } const size_t N = services.size(); if (N > 1) { // first print a list of the current services aout << "Currently running services:" << endl; for (size_t i=0; i service = sm->checkService(services[i]);//获取相应的服务 ...... } } for (size_t i = 0; i < N; i++) { ...... { int err = service->dump(remote_end.get(), args);//调用service相应的dump()方法 }); ...... } return 0;}
从代码中可以看出:
先通过defaultServiceManager()函数获得ServiceManager对象;然后通过sm->listServices(),获取系统所有向ServiceManager注册过的服务;接下来根据dumpsys传进来的参数通过函数checkService来找到具体的service, 并执行该service的dump方法,达到dump service的目的。
dumpsys cpuinfo实例
dumpsys的实现其实是根据参数来找到某个具体的服务,然后执行其dump方法。我们熟悉的系统服务有ActivityManagerService、PackageManagerService等,而cpuinfo对应的服务是什么呢?
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java中有下面这段代码:
public void setSystemProcess() { try { ...... if (MONITOR_CPU_USAGE) { ServiceManager.addService("cpuinfo