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
原创粉丝点击