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.cpp
LOCAL_SHARED_LIBRARIES := \
libutils \
liblog \
libbinder
ifeq ($(TARGET_OS),linux)
LOCAL_CFLAGS += -DXP_UNIX
#LOCAL_SHARED_LIBRARIES += librt
endif
LOCAL_MODULE:= dumpsys
include $(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信息。