一
介绍Alarm
开发者们应该都知道,Alarm可以完成闹钟式定时任务,系统主要通过AlarmManager类对其进行管理,我们可以通过AlarmManager在一些Alarm设定的时间点启动服务进行事件处理,同时还可以用Alarm来初始化一些长时间运行的操作。
二
Alarm对功耗的影响
Alarm设计不当会导致电量过度消耗,正常情况下应用放置在后台CPU会处于休眠状态,功耗值趋于稳定且数值较小。Alarm会调起CPU处理事件使其处于工作的状态,造成功耗值上升并且会持续一段时间。如图所示为后台应用Alarm唤醒的功耗趋势。频繁的Alarm会导致电池电量过度消耗。
三
DevEco检测方案
华为DevEco云测平台通过检测应用在灭屏1小时内,后台对唤醒设备Alarm的占用来衡量应用是否存在不合理使用Alarm的情况。
DevEco具体Alarm占用测试方法如下:
1.将应用安装,启动正常操作几分钟后,放置后台,灭屏,执行以下指令
2.模拟拔除电缆:adb shell dumpsys battery unplug
3.清理上次的测试数据:adb shell dumpsys batterystats --reset
4.允许记录所有Wake信息:adb shell dumpsys batterystats--enable full-wake-history
5.一小时后,执行adb bugreport >bugreport.txt导出bugreport报告
通过分析bugreport(参考Battery Historian的搭建),Wakeup Alarm info里面的Alarm累计唤醒次数进行判断。
四
测试应用
本次测试选取了7款生鲜电商类App及版本:
应用名称 | 版本 |
---|---|
盒马 | 4.24.1 |
每日优鲜 | 9.6.2 |
京东到家 | 7.1.1 |
苏宁小店 | 4.0.11 |
多点 | 4.4.5 |
永辉生活 | 5.10.0.51 |
本来生活 | 5.0.1 |
测试结果
测试结果显示盒马的Alarm次数大于联盟的标准值20次/小时且Alarm唤醒次数高达56次/小时,超出标准值2倍多。京东到家、苏宁小店、本来生活和永辉生活Alarm唤醒次数均为0次,多点与每日优鲜均小于10次/小时都表现良好。
图中显示了盒马放置在后台一个小时的Alarm的具体信息。CONNECT_EVENT和app_keep_alive事件的Alarm唤醒次数较多,希望应用合理设置Alarm,减少不必要的耗电行为。
五
建议
1.减少定时唤醒闹钟已经休眠的设备的频率。
2.设备在休眠状态,减少拉取数据、主动PUSH等触发Alarm的操作。
3.使用setInexactRepeating()来替换setRepeating(),Android会同步触发多个应用重复的Alarm。可以减少系统唤醒设备的总次数,从而减少了电池的耗电量。
4.在Repeating Alarm触发的网络请求里添加随机性(抖动)操作,尽可能降低Alarm触发频率,除非必要,否则不使用唤醒设备的Alarm(Wakeup_Alarm)与高精度的RTC时钟。
end