dumpsys原理
来源:互联网 发布:阿里云短信接口 编辑:程序博客网 时间:2024/06/06 23:18
dumpsys在分析问题时,是一个常用的工具,用来dump系统相关信息。
如:
dumpsys activity 当前系统所有activity堆栈信息
dumpsys cpuinfo 当前系统CPU相关信息
dumosys在/system/bin目录下,因此我们可以abd shell调用,如果有android源码,则可以make dumpsys,对应mk文件:/frameworks/native/cmds/dumpsys/Android.mk
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_SRC_FILES:= \ dumpsys.cppLOCAL_SHARED_LIBRARIES := \ libutils \ liblog \ libbinderifeq ($(TARGET_OS),linux) LOCAL_CFLAGS += -DXP_UNIX #LOCAL_SHARED_LIBRARIES += librtendifLOCAL_MODULE:= dumpsysinclude $(BUILD_EXECUTABLE)
从mk文件可知,源文件中只有dumpsys.cpp文件,看下执行过程:
int main(int argc, char* const argv[]){ signal(SIGPIPE, SIG_IGN); //获取ServiceManager sp<IServiceManager> 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<String16> services; Vector<String16> args; bool showListOnly = false; //命令为"dumpsys -l",执行此分支 if ((argc == 2) && (strcmp(argv[1], "-l") == 0)) { showListOnly = true; } // if ((argc == 1) || showListOnly) { //不带参数的命令为"dumpsys",获取系统所有的服务 services = sm->listServices(); services.sort(sort_func); args.add(String16("-a")); } else { //带参数则只获取指定服务名的信息 services.add(String16(argv[1])); for (int i=2; i<argc; i++) { args.add(String16(argv[i])); } } 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<N; i++) { //获取相应的服务 sp<IBinder> service = sm->checkService(services[i]); if (service != NULL) { aout << " " << services[i] << endl; } } } if (showListOnly) { return 0; } for (size_t i=0; i<N; i++) { sp<IBinder> service = sm->checkService(services[i]); if (service != NULL) { if (N > 1) { aout << "------------------------------------------------------------" "-------------------" << endl; aout << "DUMP OF SERVICE " << services[i] << ":" << endl; } //调用service相应的dump()方法 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;}
从代码中,可以得出dumpsys主要工作分为以下4个步骤:
defaultServiceManager(),获取ServiceManager对象;
sm->listServices(),获取系统所有向ServiceManager注册过的服务;
sm->checkService(),获取系统中指定的Service;
service->dump(),dumpsys命令的核心还是调用远程服务中的dump()方法来获取相应的dump信息。
0 0
- dumpsys原理
- dumpsys实现原理
- dumpsys
- dumpsys
- dumpsys
- dumpsys
- dumpsys
- dumpsys
- dumpsys
- Android:dumpsys功能之一:原理介绍
- dumpsys实现原理以及gfxinfo实例讲解
- android dumpsys
- android dumpsys
- Android dumpsys
- dumpsys使用
- android dumpsys
- Android: dumpsys
- Android dumpsys
- 斐波拉契数列进行编译,采用三种不同的方法实现,迭代,递归,数组
- 2016年湖南省第十二届大学生计算机程序设计竞赛:A—2016
- Python: 函数与方法的区别 以及 Bound Method 和 Unbound Method
- java.lang.IndexOutOfBoundsException: Inconsistency detected.
- 外观模式
- dumpsys原理
- C# 多线程随手记
- log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader)
- AngularJS 设置元素样式
- 浅谈四轴PID调试心得
- Python: 解释 yield 和 Generators(生成器)
- 计算导论与C语言基础week6
- 关于一些暴力的事情:枚举(1)
- Paint之setXfermode----实现刮刮乐效果