前言,电量消耗的计算与统计是一件麻烦而且矛盾的事情,记录电量消耗本身也是一个费电量的事情。唯一可行的方案是使用第三方监测电量的设备,这样才能够获取到真实的电量消耗。
工具:Battery Historian, 是一款由Google提供的Android系统电量分析工具.使用Battery Historian需要搭建GO开发环境。需要更加直观的观察电量数据,还需要搭建Python开发环境。(参考文献:http://www.it610.com/article/5231420.htm)
通过Battery Historian获取了手机电量总情况后,研究手机电量使用情况,并找出项目对手机电量的使用情况,分析电量使用情况,并研究项目电量优化的策略。
主要指标解释:
横坐标:时间周期,60秒为一个周期;
battery_level: 电池的电量情况;
plugged: 充电状态及充电的时长;
screen: 屏幕是否点亮及时间
top: 该栏显示当前时刻哪个app处于最上层,就是当前手机运行的app,用来判断某个app对手机电量的影响,这样也能判断出该app的耗电量信息。
wake_lock*: wake_lock 该属性是记录wake_lock模块的工作时间。是否有停止的时候等。
running: 界面的状态,主要判断是否处于idle的状态。用来判断无操作状态下电量的消耗。
wake_lock_in: wake_lock有不同的组件,这个地方记录在某一个时刻,有哪些部件开始工作,以及工作的时间。
data_conn:数据连接方式的改变,上面的edge是说明采用的gprs的方式连接网络的。此数据可以看出手机是使用2g,3g,4g还是wifi进行数据交换的。这一栏可以看出不同的连接方式对电量使用的影响。
status:电池状态信息,有充电,放电,未充电,已充满,未知等不同状态。这一栏记录了电池状态的改变信息。
phone_signal_strength:手机信号状态的改变。这一栏记录手机信号的强弱变化图,依次来判断手机信号对电量的影响。
health:电池健康状态的信息,这个信息一定程度上反映了这块电池使用了多长时间。这一栏记录电池状态在何时发生改变。
plug:充电方式,usb或者插座,以及显示连接的时间。这一栏显示了不同的充电方式对电量使用的影响。
补充:之前仅仅为项目电量情况进行一次系统诊断,但用户使用过程中出现的异常电量使用情况无法被统计与分析。所以对用户使用项目的持续诊断与分析是至关重要的。
为持续诊断设计策略时,发现新的问题:与应用的正常行为相比,持续监控电池电量会消耗更多电量。因此,比较合适的做法是只监控电池电量的显著变化(尤其是在设备进入或结束低电量状态的情况下)。比如 用户容易感知到的电量变化节点:低电量状态,手机电量过低自动关机,电池温度等异常状态下进行监控并将数据上传服务器。再在服务器中进行统计分析后,通知手机做出电量补救措施。(持续诊断操作步骤相当耗时,故可选)
通过手机广播来接受到手机电池电量的显著变化:
// BatteryManager.BATTERY_STATUS_CHARGING 表示是充电状态
// BatteryManager.BATTERY_STATUS_DISCHARGING 放电中
// BatteryManager.BATTERY_STATUS_NOT_CHARGING 未充电
// BatteryManager.BATTERY_STATUS_FULL 电池满
//充电类型 BatteryManager.BATTERY_PLUGGED_AC 表示是充电器,不是这个值,表示是 USB
//电池健康情况,返回也是一个数字
//BatteryManager.BATTERY_HEALTH_GOOD 良好
//BatteryManager.BATTERY_HEALTH_OVERHEAT 过热
//BatteryManager.BATTERY_HEALTH_DEAD 没电
//BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE 过电压
//BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE 未知错误
电量优化建议:
第一:项目存在大量的轮询请求接口。应该将其整合起来,减少CPU的消耗。
第二(可选):项目的直播或音频是电量消耗大户,可判断用户是否处于充电状态,再获取用户电量,在某个临界点时,降低直播码率,提高观看直播时间。
第三:清单文件application标签下keepScreenOn保持屏幕常亮模式不够完善,导致用户长时间无操作情况下,屏幕长时间 保持常亮。建议修改模式为:用户5分钟未操作状态下,屏幕变暗且屏幕不关闭。满足屏幕处于开启状态下节约用电。
第四(可选):项目存在大量的图片展示,图片加载时会消耗大量的流量与电量。方案一:可判断用户是否处于充电 状态,再获取用户电量,在某个临界点时,降低加载图片码率,提高操作时间。
第五:项目也有一些上传下载操作进行着,可采用高效下载策略,做到批量执行网络请求,尽量避免频繁的间隔网络请 求。判断哪些任务是不紧急的,可以交给Job Scheduler来处理,Job Scheduler集中处理收到的任务,选择合适的时间,合适的网 络,再一起进行执行。
结语: 测试电量与优化是一条漫长的道路,也希望大家有“把电量当成干粮”的意识,这样你所做的app也会更加优雅。