zoukankan      html  css  js  c++  java
  • 应用后台省电秘籍——低功耗状态下应用如何正常运行?

    应用退居后台,如何在低功耗的情况下保证任务正常运行?本文华为软件功耗专家黄文将分享议题——应用后台功耗经验。

    本文将从安卓绿色联盟功耗标准2.0、谷歌后台功耗方案、华为后台功耗方案以及开发者资源使用建议和检测工具五大方面进行全面讲解。

    安卓绿色联盟功耗标准2.0

    《安卓绿色联盟应用体验标准2.0---功耗标准》详细介绍了应用后台软资源和硬资源的使用标准,查看详情请访问安卓绿色联盟官网。

    谷歌后台功耗方案

    谷歌从Android M开始着力改善终端的续航表现。Android版本在演进中主要提供如下几个方案。

    1.后台位置限制:

    对后台应用获取用户当前位置的频率进行限制。

    相关链接:https://developer.android.google.cn/about/versions/oreo/background-location-limits

    2.后台服务限制:

    限制应用在后台运行服务,并禁止应用通过隐藏/不可见方式调用 CPU 或网络资源。

    相关链接:https://developer.android.google.cn/about/versions/oreo/background#services

    3.后台限制:

    当系统检测到应用出现不良行为时,系统会向用户询问是否要限制该应用在后台访问设备资源。

    相关链接:https://developer.android.google.cn/topic/performance/background-optimization#bg-restrict

    4.谷歌后台功耗方案-Doze(低耗电模式和应用待机模式)

    谷歌在Android M版本引入了Doze方案,此方案主要针对后台应用在没有活动的情况下做某些限制。设备未充电且屏幕关闭处于空闲状态一段时间后,系统会进入低耗电或者应用待机模式,对应用行为施加相应限制。

    相关链接:https://developer.android.google.cn/about/versions/marshmallow/android-6.0-changes#behavior-power

     

     

    如图所示,以下是Doze模式各状态说明:

    ACTIVE: 设备活动态

    INACTIVE:设备不活跃(灭屏、不运动) 等待进入idle.

    IDLE_PENDING: 设备准备进入下一阶段

    SENSING: 传感器检测设备是否运动

    LOCATING: 设备位置变化.

    IDLE: 设备进入idle,并尽量长时间保持该状态

    IDLE_MAINTENANCE: 退出idle进入“维护期”

    谷歌还引入了Light-Doze(Android N)和Deep-Doze(Android M)的概念,具体内容如下:

     

    5.应用待机群组

    应用待机群组对应用进行分组管理,不同的分组享有不同的权限设置,杜绝了对应用一刀切的现象。

    相关链接:https://developer.android.google.cn/preview/features/power#buckets

    应用待机分组:

    1)活跃 (Active): 应用正在被使用

    2)工作 (Working set): 应用使用频率很高

    3)常用 (Frequent): 应用经常但不是每天被使用

    4)极少 (Rare): 应用偶尔被使用

    5)从不(Never):安装后一次都未被使用过的应用

    分组策略:

     

    调试:

    通过adb命令将应用手动划分至某一待机群组。输入以下命令,更改群组:

    $ adb shell am set-standby-bucket packagename active/working_set/frequent/rare

    输入以下命令,查看应用所处群组:

    $ adb shell am get-standby-bucket [packagename]

    为促进用户体验,谷歌对应用在后台状态下的建议如下:

     

    华为后台功耗方案

    1.华为的功耗方案,主要是在谷歌的基础上对应用的异常行为进行监控,通过智电机器人,识别后台应用的行为是正常耗电还是异常耗电。

    2.华为的优化分为主动优化和异常防护。

    主动优化在谷歌运行方案的基础上增加了冷冻方案,应用退到后台后,在没有用户可感知状态和活动下,将应用所占用的资源包括CPU、软硬件资源等全部暂停。一旦应用需要运行,资源会启动恢复流程,这就是主动优化。

    华为的盾防系统会监控所有后台资源消耗情况,在用户未感知的情况下,一旦资源消耗超过华为功耗红线标准,便会发出高耗电提醒,这就是华为的异常防护。

    具体红线标准请参考《安卓绿色联盟应用体验标准2.0---功耗标准》,标准包括持锁阻止系统休眠、alarm频繁唤醒系统、后台CPU高负载耗电、长时间网络定位等。

    3.华为低功耗Power kit包括PUSH+NC和Bastet链路托管技术。

    应用推送远程通知,可以使用华为PUSH NC。

    相关链接:

    https://developer.huawei.com/consumer/cn/service/hms/pushservice.html

    应用保持长链接,可以接入华为链路托管技术Bastet.

    相关链接:

    https://developer.huawei.com/consumer/cn/devservice/doc/30401

    开发者资源使用建议

    1.定时任务

    推荐绿色机制:

    • 本地高频任务,建议使用Handler机制;
    • 本地低频定时任务,建议使用AlarmManager的set()和setInexactRepeating()方法分别处理单次和循环多次的调用;
    • 特定条件(网络、充电),可延迟定时任务,推荐JobScheduler/WorkManager。

    2.网络

    推荐绿色机制:

    • 避免频繁、零散的网络请求,推荐统一批量网络请求;
    • 避免在低电量、弱网络、移动网络执行过多的网络请求,在充电、wifi网络下进行大数据量请求;
    • 应用离开界面或进入后台及时关闭不再使用的TCP链接,避免出现大量未关闭状态TCP链接。

     

     

     

    3.Wakelock

    推荐绿色机制:

    • 确保唤醒锁不再需要时立即释放;
    • 申请和释放必须成对出现;
    • 推荐使用超时锁acquire(timeout),提前结束后主动释放超时锁。

    资源使用检测工具

    1.Battery Historian

    相关链接:https://developer.android.google.cn/topic/performance/power/battery-historian

    2. AT&T Application Resource Optimizer

    擅长于网络跟踪

    相关链接:

    https://developer.att.com/application-resource-optimizer

    3. Android vitals

    对过度唤醒、wifi扫描、网络使用、长时间持唤醒锁、进行监控,并输出报告

    相关链接:https://developer.android.google.cn/topic/performance/vitals/

    总结

    为保证应用在低功耗的情况下能够正常的运行任务,建议使用如下方案:

    1.研发阶段:

    1)推送远程通知消息,需使用FCM或华为PUSH NC。

    2)保持长链接心跳,需使用华为Modem链路托管技术(华为Bastet)

    3)用户触发的后台业务,需使用前台服务+常驻通知。

    • 后台下载、播放音乐、录音、导航、计步、骑行记录轨迹、同步照片等。
    • 让用户能够感知到(可见、可听),包括声音、通知栏、widget提示等。

    4)非用户触发可推迟的任务,需使用JobScheduler/WorkManager。

    • 需在充电、Wifi环境、Doze窗口期进行。
    • 禁止在低电量(<30%)、省电模式、长待机(灭屏超过30min)、夜间(0:00~6:00)进行。

    5)合理使用Alarm,Wakelock,Network,GPS等软硬资源。

    • 统一使用,避免频繁使用。
    • 按需使用,及时释放。

    2.测试验收:

    借助工具,使用battery-historian、 ARO、Android vitals分析运行时和长待机情况。

    3.禁止行为:

    恶意保活,包括无声播放、一像素界面、低流量下载等。

    关注安卓绿色联盟公号,回复“2304”获取PPT

  • 相关阅读:
    C语言宏的定义和宏的使用方法(#define)
    C语言字符串拼接
    OC字符串与C语言字符串之间的相互转换
    C语言#include的用法
    NSSet集合
    NSArray 数组
    预定义宏,C语言预定义的宏详解
    主流C语言编译器介绍
    无法使用此电子邮件地址。请选择其他电子邮件地址
    可变大小、颜色边框、样式的UISwitch
  • 原文地址:https://www.cnblogs.com/androidga/p/10401615.html
Copyright © 2011-2022 走看看