一、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信息。
二、实例
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混合功耗会比较高。
参考:
dumpsys原理简介:http://gityuan.com/2015/08/22/tool-dumpsys/