开发者们应该都知道,Alarm可以完成闹钟式定时任务,系统主要通过AlarmManager类对其进行管理,我们可以通过AlarmManager在一些Alarm设定的时间点启动服务进行事件处理,同时还可以用Alarm来初始化一些长时间运行的操作。
Alarm设计不当会导致电量过度消耗,正常情况下应用放置在后台CPU会处于休眠状态,功耗值趋于稳定且数值较小。Alarm会调起CPU处理事件使其处于工作的状态,造成功耗值上升并且会持续一段时间。如图所示为后台应用Alarm唤醒的功耗趋势。频繁的Alarm会导致电池电量过度消耗。
华为DevEco云测平台通过检测应用在灭屏1小时内,后台对唤醒设备Alarm的占用来衡量应用是否存在不合理使用Alarm的情况。
1.将应用安装,启动正常操作几分钟后,放置后台,灭屏,执行以下指令
2.模拟拔除电缆:adb shell dumpsys batteryunplug
3.清理上次的测试数据:adb shell dumpsysbatterystats --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频率设置必要性,希望应用合理设置Alarm,减少不必要的耗电行为。
1.减少定时唤醒闹钟已经休眠的设备的频率。
2.设备在休眠状态,减少拉取数据、主动PUSH等触发Alarm的操作。
3.使用setInexactRepeating()来替换setRepeating(),Android会同步触发多个应用重复的Alarm。可以减少系统唤醒设备的总次数,从而减少了电池的耗电量。
4.在Repeating Alarm触发的网络请求里添加随机性(抖动)操作,尽可能降低Alarm触发频率,除非必要,否则不使用唤醒设备的Alarm(Wakeup_Alarm)与高精度的RTC时钟。