前言
现在手机中虽然都有电量统计,但是并不能对应用的耗电信息进行实时监控,要想知道某些应用在前后台的耗电变化,还是很困难的。故这里打几个桩,实现应用耗电量的监控。
一、电量相关类
在AOSP Androdi-9.0.0中与电量相关的几个类:
1 BatteryService:负责监听充电状态和电量变化。
2 BattteryStatsService:负责电池信息的收集,以及各个部分耗电量的统计。
3 BatteryStatsImpl:BattteryStatsService类的委托类,BattteryStatsService类的所有操作都交给它去完成。
4 BatteryStatsHelper:计算各个应用和服务的电量使用情况,其利用BattteryStatsService中统计的时长和电源配置文件中的功耗配置值,通过计算得到耗电信息。
5 PowerProfile:负责解析电源配置文件。
6 BatterySipper:用来存放应用、系统服务、硬件的耗电信息。
其中BatteryStatsHelper类中有一个关键函数refreshStats,该函数会刷新当前的耗电量统计,也就是说,每次调用该函数,都会刷新当前手机中的耗电量信息。refreshStats函数中是通过调用processAppUsage函数来完成应用的耗电量统计。processAppUsage函数是以应用的UID为单位,对应用进行耗电量统计,每个应用的耗电量数据都保存在BatterySipper对象中,并将BatterySipper对象统一保存在mUsageList变量中。
二、实现方案
本方案的实现主要要做两件事:遍历统计后的耗电量和循环刷新当前耗电量信息
要完成遍历耗电量,只需在完成应用耗电量统计之后,遍历mUsageList变量,即可获得当次刷新的应用耗电量统计。本方案是在BatteryStatsHelper类的processAppUsage函数的结尾处插入代码,遍历mUsageList对象,取出各应用耗电量的存储对象BatterySipper,然后在BatterySipper中取出耗电量的统计值totalPowerMah,并输出耗电量信息:
现在还有一个问题,那就是如何进行耗电量的循环刷新。正常情况下,只有在用户点击手机中设置功能的电池电量信息,才会触发一次耗电量的统计。那要想进行耗电量的持续监控,就必须要让系统进行持续的耗电量刷新才能完成。本方案中采用的方法是,在初始化BatteryStatsHelper类时,创建一个线程,每10秒刷新一次耗电量信息。由于BatteryStatsHelper是在BatteryUtils类的initBatteryStatsHelper函数中进行初始化的,故就在initBatteryStatsHelper函数中插入线程。这样,只需查看一次电池电量信息,就能激活刷新线程,每10秒输出一次电量信息:
本方案采取的是以Log的形式将应用的UID和耗电量输出在控制台。每个应用安装在手机之后,会被分配一个固定的UID,通过UID可以区分不同的应用的耗电量:
python写个工具,对Log中输出的数据进行统计,并excel绘制表格并制图为如下:
谁在耗电,一目了然