造成手机耗电的主要因素可以分为硬件和软件两方面,作为应用开发者,只能从软件方面发力,应用低功耗开发就显得尤其重要。
谷歌和华为在功耗管理方面的机制到底是怎么样的,应用在开发时资源如何配置才能达到最佳的功耗方案?
本期,由华为终端功耗架构师钱华君为大家带来《应用低功耗开发探讨》,解析应用耗电这点事。
绿盟功耗标准解读
1、手机耗电因素有哪些?
硬件视角:
SoC(CPU、GPU、NPU、DDR等)、屏幕、Modem、 WiFi、 Audio、Camera、GPS、 Sensors、FlashLight、BlueTooth、NFC等。
软件视角:
进程/线程-Alarm、BroadcastMsg、 Notifications、Wakelock、Interrupt等。
应用在开发过程需要关注可能会用到的器件,在灭屏后台使用时不涉及到屏幕功耗等。
2、应用耗电情况用户画像
据大数据统计分析发现,随着无限流量的套餐的推出,用户亮屏使用时长、日均数据流量呈上升趋势。下图是基于大数据分析,样本采取不同年龄阶段的平均数值得出的。
用户经常使用的应用是浏览类和社交类,分别占比是24%、21%,其次是游戏、短视频等。而这些应用分类中,游戏类、视频类应用相对耗电较高,所以在应用开发过程中要格外关注。另外我们还发现,当应用耗电较低时更有可能使用户使用该应用的时间变长。
3、绿盟功耗标准简要解析
联盟功耗标准依据常见的应用使用场景对手机硬件设备的需求度进行了粗略划分,并在对应的情况下给出了例子以及参考的设备使用标准以及使用规范。
-
针对应用前台各场景,本标准暂不做强制规范。
-
针对应用后台各场景,本标准除规范其对手机硬件设备的使用频率和使用时长外,还规范其对Wake Lock、Alarm的使用情况,并将其在标准环境中的后台耗电情况作为参考标准执行。
-
本文将按照以下设备来进行描述:
标准2.0主要关注的是后台的应用,为了进一步提升用户应用使用体现,联盟正联合各专家制定标准3.0,新标准中会增加一些对前台应用的功耗的约束,欢迎大家持续关注。
谷歌和华为功耗管理方案
1、谷歌后台功耗方案
为了改善续航表现和用户体验,Android 在版本演进中提供如下方案:
-
低耗电模式和应用待机模式:设备未充电,屏幕关闭处于空闲状态一段时间,系统会进入低耗电或者应用待机模式,对应用行为施加相应限制;
-
后台位置限制:对后台应用获取用户当前位置的频率进行限制;
-
后台服务限制:限制应用在后台运行服务,并禁止应用通过隐藏/不可见方式调用 CPU 或网络资源;
-
应用待机分组:限制非活跃应用对设备资源的调用;
-
后台限制:当系统检测到应用出现不良行为时,系统会向用户询问是否要限制该应用在后台访问设备资源。
谷歌的分组机制
这个分组机制是谷歌首次提出来的,今年的Android Q版本的待机分组机制算法做了一些优化,可以分成以下五类:
-
活跃 (Active): 应用正在被使用
-
工作 (Working set): 应用使用频率很高
-
常用 (Frequent): 应用经常但不是每天被使用
-
极少 (Rare): 应用偶尔被使用
-
从不(Never):安装后一次都未被使用过的应用
分组策略:
2、华为后台功耗方案
华为的后台功耗方案,在谷歌的后台功耗方案基础上做了一些增强。第一条是要豁免正常业务的资源使用,保证业务的资源不受到任何限制,这个主要依赖于准确的识别出哪些是用户正在感知的业务,如果不是用户正常使用的业务,可能也要做一些资源方面的限制,比如持组、频繁唤醒、应用频繁自启等。
华为PUSH通道
谷歌的通用PUSH方案是FCM,但这个机制只适用海外,国内的应用厂商一般都有自己的PUSH通道,华为也不例外。比如应用先发到华为的PUSH,然后发到指定的手机里面,通过一个消息通知中心,在手机屏幕上面就会显示收到什么通知,点开通知的时候应用就会拉起,如果只有看的动作应用本身不会被拉起,可能还会在后台休眠,通过这种方式我们可以做到一个比较省电的目的。
资源使用建议及工具推荐
1、资源使用建议
定时任务
-
本地高频任务,使用Handler机制;
-
本地低频定时任务,使用AlarmManager的set()和setInexactRepeating()方法分别处理单次和循环多次的调用;
-
特定条件(网络、充电),可延迟定时任务,推荐JobScheduler/WorkManager。
网络
-
避免频繁、零散的网络请求,推荐统一批量网络请求;
-
避免在低电量、弱网络、移动网络执行过多的网络请求,在充电、wifi网络下进行大数据量请求;
-
应用离开界面或进入后台及时关闭不再使用的TCP链接,避免出现大量未关闭状态TCP链接。
Wakelock
-
确保唤醒锁不再需要时立即释放;
-
申请和释放必须成对出现;
-
推荐使用超时锁acquire(timeout),提前结束后主动释放超时锁。
2、资源使用检测工具
BatteryHistorian
在开发安卓应用的时候,如何保证开发出来的软件在资源使用上是正常的,这里推荐大家使用BatteryHistorian,它可以分析出资源使用的情况。进入开发者模式,操作执行完了之后会把所有的信息进入到一个文件里面,只需要把这个文件上传到服务端,就会出现使用介绍。
更多信息可访问:https://developer.android.google.cn/topic/performance/power/battery-historian
AT&T ApplicationResource Optimizer 诊断工具
这款工具擅长网络跟踪。
更多信息可访问:https://developer.att.com/application-resource-optimizer
Android vitals工具
对应用过度唤醒、wifi扫描、网络使用、长时间持唤醒锁、进行监控,并输出报告。
更多信息可访问:https://developer.android.google.cn/topic/performance/vitals
小结
研发阶段:
1. 推送远程通知消息,需使用FCM或华为PUSH NC;
2. 用户触发的后台业务,需使用前台服务+常驻通知;
-
后台下载、播放音乐、录音、导航、计步、骑行记录轨迹、同步照片等;
-
让用户能够感知到(可见、可听),包括声音、通知栏、widget提示等。
3. 非用户触发可推迟的任务,需使用JobScheduler/WorkManager;
-
需在充电、Wifi环境、Doze窗口期进行;
-
避免在低电量(<30%)、省电模式、长待机(灭屏超过30min)、夜间(0:00~6:00)进行。
4. 合理使用Alarm,Wakelock,Network,GPS等软硬资源;
-
统一使用,避免频繁使用;
-
按需使用,及时释放。
测试验收:
借助工具,使用battery-historian、 ARO、Android vitals分析运行时和长待机情况。
反对:
恶意保活,包括无声播放、一像素界面、低流量下载等。