dumpsys学习笔记—1

一、dumpsys源码

dumpsys是Android自带的强大debug工具,命令源码来自dumpsys.cpp文件,位置为:frameworks/native/cmds/dumpsys/dumpsys.cpp

int main(int argc, char* const argv[]) {
    signal(SIGPIPE, SIG_IGN);
    //获取ServiceManager
    sp<IServiceManager> sm = defaultServiceManager();
    fflush(stdout);
    if (sm == NULL) {
        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) {
        // 打印出第一行信息
        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()方法,这是整个dumpsys命令的精华
            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个步骤:

sp<IServiceManager> sm = defaultServiceManager(),获取ServiceManager对象;
Vector<String16> services = sm->listServices(),获取系统所有向ServiceManager注册过的服务;
sp<IBinder> service = sm->checkService(),获取系统中指定的Service;
service->dump()dumpsys命令的核心还是调用远程服务中的dump()方法来获取相应的dump信息

 

二、用法

1. 命令帮助信息

/ # dumpsys --help
usage: dumpsys
        直接使用dumpsys,就是dump所有的服务。
or:
       dumpsys [-t TIMEOUT] [--priority LEVEL] [--pid] [--thread] [--help | -l | --skip SERVICES | SERVICE [ARGS]]
         --help: 显示此帮助信息
         -l: 只是列出所有服务,但并不dump它们。only list services, do not dump them
         -t TIMEOUT_SEC: 指定以秒为单位的超时时间,若不指定默认是10s.
         -T TIMEOUT_MS: 指定以毫秒为单位的超时时间,若不指定默认是10s.
         --pid: dump 只显示服务的 PID,dumpsys --pid <service_name>
         --thread: dump只显示线程使用情况
         --proto: 支持以原始格式dump数据的过滤服务。 dump将采用原始格式。
         --priority LEVEL: 基于指定优先级 LEVEL 的过滤服务必须是 CRITICAL | HIGH | NORMAL 之一。
         --skip SERVICES: dump除了SERVICES以外的所有服务(逗号分隔的列表).
         SERVICE [ARGS]: 只dump SERVICE这一个服务,ARGS 是传给它的可选参数。如 dumpsys gfxinfo <pkg> framestats

2. 使用举例

dumpsys activity

由前面的原理可知,先要查询sm->checkService(“activity”),这里得到的是 ActivityManagerService,那么也就意味着上述命令等价于调用 ActivityManagerService.dump()。其它的类似。

相关文章:

1. 如果有兴趣要了解从源码角度是如何获取ServiceManager和Service,可查看文章:
Binder系列4—获取ServiceManager:http://gityuan.com/2015/11/08/binder-get-sm/
Binder系列6—获取服务(getService):http://gityuan.com/2015/11/15/binder-get-service/

 

三、dumpsys电池操作

1、获取电池信息

$ adb shell dumpsys battery

$ adb shell dumpsys battery
Current Battery Service state:
    AC powered: false       //false表示没使用AC电源
    USB powered: true       //true表示使用USB电源
    Wireless powered: false    //false表示没使用无线电源
    status:               //2表示电池正在充电,1表示没充电
    health:               //2表示电池状态优秀
    present: true           //true表示已安装电池
    level:                //电池百分比
    scale:                //满电量时电池百分比为100%(不确定是否正确)
    voltage:               //电池电压3.781V
    temperature:            //电池温度为25摄氏度
    technology: Li-ion        //电池类型为锂电池

2、电池信息设置格式

$ adb shell dumpsys battery
  set [ac|usb|wireless|status|level|invalid] <value>
  unplug  //模拟断开充电
  reset   //复位

3、设置为AC/USB/Wireless充电

$ adb shell dumpsys battery set ac/usb/wireless 1

4、设置电池为充电状态

$ adb shell dumpsys battery set status 2

5、设置电池为非充电状态

$ adb shell dumpsys battery set status 1

6、设置电量百分比

$ adb shell dumpsys battery set level 100

7、设置断开充电(Android 6.0以上)

$ adb shell dumpsys battery unplug

8、复位,恢复实际状态

$ adb shell dumpsys battery reset

再敲入 adb shell dumpsys battery 查看一下手机是否已经恢复状态。

 

四、Android Doze模式启用和恢复

1. 模拟手机未充电状态

$ adb shell dumpsys battery 这段命令查看一下手机当前的状态
$ adb shell dumpsys battery unplug 模拟手机未充电状态

弱此时我们看到 AC powered 和 USB powered 都已经关闭,证明模拟手机未充电状态成功。

2. IDLE有效化

$ adb shell dumpsys deviceidle enable 让IDLE有效化。

3. 进入IDLE模式方法

有两种方法:

(1)屏幕亮着状态按下电源按钮关闭屏幕,敲入命令让其进入IDLE模式。(注意:我们在切换状态的时候要重复输入几次命令,直到进入IDLE模式。)

$ adb shell dumpsys deviceidle 多敲几次,直到打印"Stepped to: IDLE" 进入IDLE模式。

(2)敲入命令强制让手机进入IDLE模式。

$ adb shell dumpsys deviceidle force-idle 强制进入IDLE模式
$ adb shell dumpsys deviceidle 查看若mState=IDLE,说明强制进入IDLE成功

4.恢复手机状态

当我们模拟完状态之后要恢复回去,以便手机能够正常使用。

$ adb shell dumpsys deviceidle disable
$ adb shell dumpsys battery reset 即可让手机恢复状态。
$ adb shell dumpsys battery 查看一下手机是否已经恢复状态。

 

五、显示dump

1.dumpsys SurfaceFlinger

(1) Comp Type中显示为DEVICE表示使用hw混合,若是显示为Client就表示使用的是GPU混合,使用GPU混合功耗会比较高。

 

 六、补充

1. dumpsys cpuinfo 也可以获取到 top 命令的数据(注意不是busybox top)

 

 

 

 

 

参考:

dumpsys原理简介:http://gityuan.com/2015/08/22/tool-dumpsys/

 

posted on 2020-02-02 11:58  Hello-World3  阅读(1070)  评论(0编辑  收藏  举报

导航