Android9.0 P 电源管理&android各版本电量优化功能策略

针对电量优化android的改动

在最近几个android版本中已存在的电量优化功能基础上,Android 9 引入了一些新功能来持续改进设备电源管理,以确保将系统资源提供给最需要它们的应用.

近几个android版本中电量优化功能:

Android 5.0 Lollipop:
    1.新增 Job Scheduling API 可以将作业推迟(合并)到稍后或指定条件下(如设备充电或连入 WLAN 时)执行来优化电池寿命
    2.新增 Battery Historian (电池历史数据分析工具) 通过它了解整个系统的耗电情况,以及了解您的应用对设备电池的影响

Android 6.0 Marshmallow 和 7.0 Nougat
    根据设备是否空闲状态增加Doze低电耗模式和App Standby应用待机模式

Android 8.0 Oreo
    1.后台执行限制:当应用进入已缓存状态时,如果没有活动的组件,系统将解除应用具有的所有唤醒锁.此外,系统会限制未在前台运行的应用的某些行为,具体如下:
        在后台运行的应用对后台服务的访问受到限制
        应用无法使用其清单注册大部分隐式广播(即,并非专门针对此应用的广播)
    2.后台位置限制
    为降低功耗,Android 8.0 会对所有后台应用检索用户当前位置的频率进行限制(只允许后台应用每小时接收几次位置更新)
    系统会对前台应用和后台应用进行区分.应用满足以下任一条件即视为前台应用:
        它具有可见的 Activity,无论 Activity 处于启动还是暂停状态
        它具有前台服务
        另一个前台应用通过绑定到应用的其中一个服务或使用应用的其中一个内容提供程序与应用相连
    如果以上所有条件均不满足,应用即视为后台应用

battery-historian

android 6.0低电耗Doze模式 & 6.0和7.0 Doze模式区别

Android 9(API 28)电源管理

电源管理功能可以分为两个类别:

  • 应用待机群组

系统根据用户的使用情况对应用程序进行分组,从而针对不同的分组施加不同程度的后台限制(对 CPU 或电池等设备资源的访问限制).

  • 省电模式改进

Android P 优化了现有的省电模式,在启用省电模式之后,系统将对所有应用的后台运行加以更加严格的限制

注:这些变化适用于所有应用,无论SDK是否为 Android 9.


应用待机群组:

应用待机分组可以根据应用的使用频率或者最近一次使用时间,对其资源请求进行优先级排序.应用待机分组一共有五个分组,系统会根据每个应用的使用情况,将其划分至五个优先分组中的一个,而每个分组对设备资源的调度各有不同的限制.

应用待机模式下共有以下五类群组:

1.活跃 (Active): 应用正在被使用,例如:
    应用已启动一个 Activity
    应用正在运行前台服务
    应用的同步适配器与某个前台应用使用的 content provider 关联
    用户在应用中点击了某个通知
如果应用处于“活跃”群组,系统不会对应用的作业、报警或 FCM 消息施加任何限制

2.工作 (Working set): 应用使用频率很高,例如:
    用户在大部分时间都启动的某个社交媒体应用可能就属于“工作集”群组 如果应用被间接使用,它们也会被升级到“工作集”群组中
如果应用处于“工作”群组,系统会对它运行作业和触发报警的能力施加轻度限制

3.常用 (Frequent): 应用经常但不是每天被使用,例如:
    用户在健身房运行的某个锻炼跟踪应用可能就属于“常用”群组
如果应用处于“常用”群组,系统将对它运行作业和触发报警的能力施加较强的限制,也会对高优先级 FCM 消息的数量设定限制 

4.极少 (Rare): 应用偶尔被使用,例如:
    用户仅在入住酒店期间运行的酒店应用就可能属于“极少使用”群组
如果应用处于“极少”群组,系统将对它运行作业、触发警报和接收高优先级 FCM 消息的能力施加严格限制.系统还会限制应用连接到网络的能力

5.从未使用: 安装后一次都未被使用过的应用,系统会对这些应用施加极强的限制

系统将动态分配各个应用至不同分组,并根据需求重新分配所在分组。系统或会通过利用机器学习预加载的应用,从而预测各个应用的使用概率,然后将它们编配至相应的群组中。若设备中没有安装此类系统应用,在默认情况下,系统会根据应用的近期使用情况进行等级划分。应用活跃度越高,所处分组的优先级就越高,也就相应地更容易获取设备资源。尤其是,应用所处的的群组决定了其所安排的任务 (job),触发标准闹铃以及接受高优先级Firebase Cloud Messagesing信息的频率。这些限制仅在非充电状态下才有效;当设备充电时,应用并不会受到系统限制

注意:应用待机群组限制不适用于低耗电模式白名单中的应用,应用可以通过调用UsageStatsManager.getAppStandbyBucket() 查找当前属于哪个群组

APP如何适配新的电源管理功能?

  • 不要让应用所属群组处于一种不断变换的状态.设备厂商可以选择使用自己的算法编写分组应用.相反,确保应用无论处于哪一个分组时行为都很恰当

  • 如果应用没有启动器 Activity,那么它可能永远不会升级到“活跃”分组中.需要重新设计应用,使之具有此类 Activity

  • 如果应用的通知不可操作,用户与通知交互将无法触发应用向“活跃”群组的升级

  • 类似的,如果应用在收到高优先级FCM消息时不显示通知,那么它不会向用户提供与应用交互的机会,也不会借此升级到“活跃”群组中

如果用户重复忽略了某个通知,系统将向用户提供未来阻止该通知的选项.请不要为了让您的应用处于“活跃”群组而向用户滥发通知!

  • 如果应用分为多个软件包,那么这些软件包可能处于不同的群组中,进而拥有不同的访问权限级别.请务必对软件包被归类到各个群组的此类应用进行测试,以便确保应用行为正常

省电模式改进: Android 9 对省电模式进行了多处改进.设备制造商可以决定施加的确切限制.例如,在 AOSP 构建中,系统会应用以下限制:

  • 系统会更积极地将应用置于应用待机模式,而不是等待应用空闲。

  • 后台执行限制适用于所有应用,无论它们的目标 API 级别如何。

  • 当屏幕关闭时,位置服务可能会被停用。

  • 后台应用没有网络访问权限。

此外,还有一些设备特定的其他电源优化.具体参阅: 电源管理限制


测试电源管理功能下应用的运行状态:

可以使用adb shell 命令测试多个电源管理功能

1.将应用手动更改为指定应用待机群组.

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

还可以使用该命令一次设置多个软件包:

$ adb shell am set-standby-bucket package1 bucket1 package2 bucket2...

要检查应用处于哪一个群组.

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

如果您不传递 packagename 参数,命令将列出所有应用的群组.并且可以调用UsageStatsManager.getAppStandbyBucket()在运行时查找所属的群组.

2.省电模式

可以使用多个命令测试您的应用在低电量条件下的行为(还可以在Settings > Battery saver 界面将设备置于省电模式)

模拟拔下设备电源时的情形

$ adb shell dumpsys battery unplug

测试设备在低电量条件下的行为

$ adb shell settings put global low_power 1

完成测试后,撤消设备的手动设置

$ adb shell dumpsys battery reset

你可能感兴趣的:(Android,#,性能优化)