参考《移动APP性能评测与优化》的学习笔记。
一、Android电量统计接口
Android4.1版本以后在系统增加了 battery info 模块,记录一定时间周期内整机的功耗状态以及每个应用的功耗详情。
Android系统上APP的电量消耗由 cpu、wake lock、数据传输(移动网络&WIFI)、WIFI运行、GPS、other sensors组成。
在ROM源码中,组成APP电量消耗各部分定义如下:
1、CPU的电量消耗
cpuSpeedStepTimes[step] / totalTimeAtSpeeds * (userTime + systemTime) * powerCpuNormal[step];
2、wake lock的电量消耗
进程wakelock时间 * power_profiler.xml中type=cpu_awake的数值;
3、数据传输的电量消耗
进程数据传输量 * getAverageDataCost();
4、WIFI运行的电量消耗
进程WIFI运行时间 * power_profiler.xml中type=wifi_on的数值;
5、GPS的电量消耗
传感器时间 * power_profiler.xml中type=gps_on的数值;
6、other sensors的电量消耗
传感器时间 * 默认传感器的电量消耗
手机其他部分的电量消耗定义如下:
1、蜂窝通信电量消耗
运行时间 * power_profiler.xml中type=radio_active的数值;
2、屏幕电量消耗
开屏能量消耗 + 亮度能量消耗;
3、信号电量消耗
处于各信号强度下的能量消耗 + 扫描信号时的能量消耗;
4、WIFI电量消耗
WIFI开启能量消耗 + WIFI运行能量消耗;
5、CPU空闲时电量消耗
空闲时间 * power_profiler.xml中type=cpu_idle的数值;
6、蓝牙模块电量消耗
打开蓝牙的能量消耗 + 蓝牙在AT command下的能量消耗 + 进程蓝牙能量消耗;
二、通过系统文件获取电量记录
就像Linux系统对各个应用在CPU、内存上的消耗有详细的记录一样,Android系统在运行过程中在帮助解决功耗问题上或许也会留下一些记录。
Android在4.1版本以后加入了 battery info 模块,详细记录手机运行状态变化的时间点及对应的内容;
在Android5.0后Google使用工具Battery Historian 在Web端更直观地展示手机状态岁时间的变化。
而且随着6.0更新了Battery Historian2.0加入引起手机状态变化的应用,更好帮助开发者控制应用功耗;
在手机连接PC后,在终端输入命令 adb shell dumpsys batterystats 打印出详细的功耗相关信息,一类整机状态,一类应用状态。
举例 -16h26m01s882ms 090 64020241 +wakelock,表示在手机使用adb shell dumpsys batterystats之前16h26m01s882ms 的时候,手机电量剩余90%;
系统应用在这个时刻申请了一个wakelocks锁;系统的整体状态是64020241,这一串数字是对系统状态的记录;
在低16位中,每4位表示一种状态:
第0-3位表示系统屏幕的亮度,其值可以是0-5,依次表示dark、dim、medium、light、bright、other;
第4-7位表示信号强度,其值可以是0-5,依次表示none、poor、moderate、good、great、other;
第8-11位表示电话状态,其值可以是0-4,依次表示in、out、emergency、off、other;
第12-15位表示移动网络传输的状态,其值可以是0-15,依次表示none、gprs、edge、umts、cdma、evdo_0、evdo_A 、1xrtt 、 hsdpa、 hsupa、hspa、iden、evdo_b、Ite、ehrpd、hspap、other。
高16位每一位表示一种状态:16-30位依次表示的状态为bluetooth、WiFi、phone_in_call、plugged、screen、video、audio、wifi_mulicast、wifi_mulicast、wifi_scan、wifi_full_lock、wifi_running、phone_scan、gps、sensor、wake_lock。