dumpsys的使用笔记

来源:互联网 发布:股票网络销售违法嘛 编辑:程序博客网 时间:2024/06/11 15:27

dumpsys的使用笔记

概述

   Android系统中有很多服务,不同版本的Android系统,服务不尽相同,并且不同ROM厂商也提供了其定制的服务,为了方便查看这些服务的信息与状态,Android提供了dumpsys工具。

   手机连接电脑后可以执行adb shell dumpsys -l,即可查看当前所有的系统服务名称。

$ adb shell dumpsys -l    AAL    DmAgent    DockObserver    GbaService    GpuAppSpectatorService    GuiExtService    IIccPhoneBookMz    NvRAMAgent    PQ    SurfaceFlinger    access_control    accessibility    account    activity    alarm    alphame_server    android.hardware.fingerprint.IFingerprintDaemon    android.hardware.fingerprint.IGoodixFingerprintDaemon    android.hardware.ifaa.IIfaaDaemon    android.security.keystore    android.service.gatekeeper.IGateKeeperService    ...

   接着就可以通过dumpsys + name查看某个服务的具体信息。

$ adb shell dumpsys battery    Current Battery Service state:      AC powered: false      USB powered: true      Wireless powered: false      Max charging current: 0      Max charging voltage: 0      Charge counter: 0      status: 2      health: 2      present: true      level: 89      scale: 100      voltage: 4253      temperature: 280      technology: Li-ion

常用的指令

   列举一些常用的dump指令

1. 获取包信息

adb shell dumpsys package packgename用以获取某个应用包的信息,不加包名则会列出所有包信息

2. 获取窗口信息

adb shell dumpsys window用以获取窗口信息

3. 四大组件相关信息

adb shell dumpsys activity获取所有四大组件相关的信息adb shell dumpsys activity a packagename获取某个应用的Activity信息adb shell dumpsys activity s packagename获取某个应用的Service信息adb shell dumpsys activity b packagename获取某个应用的Broadcast信息adb shell dumpsys activity prov packagename获取某个应用的Provider信息adb shell dumpsys activity p packagename查询某个应用的进程状态adb shell dumpsys activity top | grep ACTIVITY要获取当前界面的Activityadb shell dumpsys activity top获取当前界面的UI信息adb shell dumpsys notification获取通知信息

4. 手机信息相关信息

adb shell dumpsys alarm获取手机闹钟信息adb shell dumpsys battery获取设备电池信息adb shell dumpsys batterystats获取设备电量使用信息adb shell dumpsys power获取电源管理信息adb shell dumpsys wifi获取wifi相关信息adb shell dumpsys netstats获取网络状态信息adb shell dumpsys display获取显示信息adb shell dumpsys display | grep DisplayDeviceInfo获取屏幕信息adb shell dumpsys cpuinfo获取CPU信息adb shell dumpsys meminfo获取内存信息adb shell dumpsys diskstats获取磁盘信息adb shell dumpsys meminfo packagename获取某个应用的内存使用信息

注:大部分母指令后加-h可以获取帮助信息,如adb shell dumpsys package -h

实现原理

   简单的介绍下实现原理

   找到其对应Android的配置文件,位于frameworks/native/cmds/dumpsys目录下,其配置如下。

LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_SRC_FILES:= \        dumpsys.cpp...LOCAL_MODULE:= dumpsysinclude $(BUILD_EXECUTABLE)

   可以看到配置文件很简单,最重要的是dumpsys.cpp文件,定位到位置frameworks/native/cmds/dumpsys/dumpsys.cpp,查看其main方法。

int main(int argc, char* const argv[]){    signal(SIGPIPE, SIG_IGN);    //获取SystemServiceManager对象    sp<IServiceManager> sm = defaultServiceManager();    ...    //保存服务的集合    Vector<String16> services;    //接收参数    Vector<String16> args;    Vector<String16> skippedServices;    ...    while (1) {        int c;        int optionIndex = 0;        //根据输入参数获取对应的值        c = getopt_long(argc, argv, "+t:l", longOptions, &optionIndex);        if (c == -1) {            break;        }        //根据对应的值选择输出对应的dump信息序列        switch (c) {        case 0:            //跳过服务以及帮助信息            if (!strcmp(longOptions[optionIndex].name, "skip")) {                skipServices = true;            } else if (!strcmp(longOptions[optionIndex].name, "help")) {                usage();                return 0;            }            break;        case 't':            //超时设置            {                char *endptr;                timeoutArg = strtol(optarg, &endptr, 10);                if (*endptr != '\0' || timeoutArg <= 0) {                    fprintf(stderr, "Error: invalid timeout number: '%s'\n", optarg);                    return -1;                }            }            break;        case 'l':            //当值为'l',只列出所有服务名            showListOnly = true;            break;        default:            fprintf(stderr, "\n");            usage();            return -1;        }    }    ...    if (services.empty() || showListOnly) {        // gets all services        //获取所有服务        services = sm->listServices();        //排序        services.sort(sort_func);        args.add(String16("-a"));    }    //计算服务个数    const size_t N = services.size();    ...    for (size_t i = 0; i < N; i++) {        //获取服务名称        String16 service_name = std::move(services[i]);        if (IsSkipped(skippedServices, service_name)) continue;        //检查服务        sp<IBinder> service = sm->checkService(service_name);        if (service != NULL) {            ...            // dump blocks until completion, so spawn a thread..            //通过线程打印dump信息            std::thread dump_thread([=, remote_end { std::move(remote_end) }]() mutable {                //打印dump信息                int err = service->dump(remote_end.get(), args);                    ...                }            });            //超时            auto timeout = std::chrono::seconds(timeoutArg);            ...        }        }    return 0;

   从上述的代码里,可以看出,dump的大致逻辑为:

  1. 通过defaultServiceManager获取SystemServiceManager的对象(SystemServiceManager顾名思义就是用来管理所有的服务);
  2. 通过SystemServiceManager获取系统所有服务,并排序;
  3. 解析接收的参数,根据参数的不同设置后续的执行指令序列;
  4. 从SystemServiceManager中找到需要输出的服务对象,执行该服务的dump方法
  5. 完成所有dump信息打印。
原创粉丝点击