dumpsys工具使用

我们知道Android使用ServiceManager服务进程来管理系统所有的服务,在系统启动时,每个服务必须注册到ServiceManager进程中,那如何查看系统运行了那些服务呢?ServiceManager提供了listServices接口来罗列出系统注册的所有服务。Android提供了dumpsys工具来dump出所有的服务信息,通过以下命令可以查看系统注册的所有服务:

adb shell dumpsys
Currently running services:
SurfaceFlinger
country_detector
cpuinfo
dbinfo
device_policy
devicestoragemonitor
diskstats
drm.drmManager
dropbox
entropy
fm
gfxinfo
hardware
input
isms
location
lock_settings
meminfo
network_management
notification
package
permission
phone
power
samplingprofiler
scheduling_policy
search
sensorservice
serial
servicediscovery
sim_manager
simphonebook
...
-------------------------------------------------------------------------------
DUMP OF SERVICE SurfaceFlinger:
Visible layers (count = 4)

...

也可以dump指定服务信息:

adb shell dumpsys SurfaceFlinger
Visible layers (count = 4)
+ Layer 0x41ba5008 (com.android.settings/com.android.settings.SprdUsbSettings)
Region transparentRegion (this=0x41ba51e4, count=0)
Region transparentRegionScreen (this=0x41ba503c, count=0)
Region visibleRegionScreen (this=0x41ba5018, count=0)
z= 21005, pos=(0,0), size=( 480, 854), crop=( 0, 38, 480, 854), isOp
aque=1, needsDithering=0, invalidate=0, alpha=0x00, flags=0x00000001, tr=[1.00,
0.00][0.00, 1.00]
client=0x41c14ee0, identity=7
format= 2, activeBuffer=[ 480x 854: 480, 2], transform-hint=0x00, queued-
frames=0, mRefreshPending=0

...

dumpsys源码分析

dumpsys工具比较简单,就是调用ServiceManager服务的listServices来查询系统注册的所有服务,并且通过checkService接口来获取服务的Binder远程代理对象,使用每个服务的dump函数来打印该服务的相关信息。 frameworks\native\cmds\dumpsys\dumpsys.cpp
int main(int argc, char* const argv[]){    signal(SIGPIPE, SIG_IGN);    //取得ServiceManager服务的远程Binder代理对象    sp sm = defaultServiceManager();    fflush(stdout);    if (sm == NULL) {ALOGE("Unable to get default service manager!");        aerr << "dumpsys: Unable to get default service manager!" << endl;        return 20;    }    Vector services;    Vector args;    //如果命令行参数只有1个    if (argc == 1) {    //使用ServiceManager服务的Binder远程代理对象查询所有的服务        services = sm->listServices();        services.sort(sort_func);        args.add(String16("-a"));    } else {    //添加命令行指定的服务及参数        services.add(String16(argv[1]));        for (int i=2; i 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]);            if (service != NULL) {                aout << "  " << services[i] << endl;            }        }    }    //调用服务的dump函数打印服务相关信息    for (size_t i=0; i service = sm->checkService(services[i]);        if (service != NULL) {            if (N > 1) {                aout << "------------------------------------------------------------"                        "-------------------" << endl;                aout << "DUMP OF SERVICE " << services[i] << ":" << endl;            }            int err = service->dump(STDOUT_FILENO, args);            if (err != 0) {                aerr << "Error dumping service info: (" << strerror(err)                        << ") " << services[i] << endl;            }        } else {            aerr << "Can't find service: " << services[i] << endl;        }    }    return 0;}

更多相关文章

  1. Android(安卓)ui utils-简单实用的Android界面工具
  2. 内核版本与Android版本对应关系
  3. Android网络请求框架AsyncHttpClient详解(整理)
  4. Android之traceview使用
  5. Android(安卓)系统启动
  6. android--系统jar包引用
  7. Android(安卓)Hook Java
  8. [置顶] Android(安卓)设置铃声分析
  9. [原]Android系统进程Zygote启动过程的源代码分析

随机推荐

  1. MySQL复制表的三种方式(小结)
  2. mysql声明游标的方法
  3. mysql中写判断语句的方法总结
  4. MySQL主从复制延迟原因以及解决方案
  5. MySQL8安装Installer版的图文教程
  6. Mysql如何在linux中实现定时备份
  7. MySQL 函数索引的优化方案
  8. Mysql索引性能优化问题解决方案
  9. Mysql排序和分页(order by&limit)及存在
  10. Mysql事务并发问题解决方案