Android P 电量管理
Android P 在现有平台的功能基础上加入多项新特性以提升设备电量管理能力,确保系统对应用进行最合适的资源分配。
电量管理特性主要体现在以下四个方面:
1. 应用待机分组
Android P 新增应用待机分组功能,让系统根据用户的使用情况而限制应用调用 CPU 或网络等设备资源。
2. 后台限制
Android P新增后台限制功能,若应用出现 Android Vitals 内所描述的不良行为,系统将提醒用户限制该应用访问设备资源。
>> Android Vitals 链接:
https://developer.android.google.cn/topic/performance/vitals/index.html
3. 省电模式的优化
Android P 优化了现有的省电助手功能,在启用该功能后,系统将对所有应用的后台运行实施加以限制。
4. 低耗电模式
当用户一段时间没有使用设备时,设备将进入低耗电模式,所有应用都将受到影响。 Android P 并未针对低电耗模式作出任何更改。
>> 低耗电模式链接:
https://developer.android.google.cn/training/monitoring-device-state/doze-standby#understand_doze
*注意:不论应用程序的 target SDK 是否为 Android P ,所有应用都受限于以上行为变更。
应用待机分组
应用待机分组是 Android P 新添加的一项电量管理功能,它能根据应用的使用频率或者最近一次使用时间,对其资源请求进行优先级排序。应用待机分组一共有五个分组,系统会根据每个应用的使用情况,将其划分至五个优先分组中的一个,而每个分组对设备资源的调度各有不同的限制。
优先分组
系统将动态分配各个应用至不同分组,并根据需求重新分配所在分组。系统或会通过利用机器学习预加载的应用,从而预测各个应用的使用概率,然后将它们编配至相应的群组中。若设备中没有安装此类系统应用,在默认情况下,系统会根据应用的近期使用情况进行等级划分。应用活跃度越高,所处分组的优先级就越高,也就相应地更容易获取设备资源。尤其是,应用所处的的群组决定了其所安排的任务 (job),触发标准闹铃以及接受高优先级Firebase Cloud Messagesing信息的频率。这些限制仅在非充电状态下才有效;当设备充电时,应用并不会受到系统限制。
*注意:设备厂商可以自行规定非活跃应用的群组划分规则。请开发者不要试图篡改应用所处的群组,而是专注于改善应用行为,确保应用被划分至目标群组后,依旧能够顺利运行。您可以调用 UsageStatsManager.getAppStandbyBucket(),查看应用当下所处群组。
应用待机模式下共有以下五类群组:
活跃 (Active): 应用正在被使用
工作 (Working set): 应用使用频率很高
常用 (Frequent): 应用经常但不是每天被使用
极少 (Rare): 应用偶尔被使用
应用偶尔被使用 (App is not frequently used)
此外,安装后一次都未被使用过的应用将被划分至 “从不” 这一特殊群组,并受到十分严格的系统限制。
*注意:应用待机群组限制不适用于低耗电模式白名单中的应用。
活跃 (Active)
活跃应用指用户正在使用的应用,例如:
应用启动了一个Activity;
应用正在运行前台服务;
另一个前台应用已关联至该应用 (通过同步适配器与前台应用的内容提供器相关联);
用户点击了应用的推送
在任务、标准闹铃以及FCM信息的资源调用上,活跃群组应用免受任何系统限制。
工作 (Working set)
若应用的运行频率很高,但目前并未处于“活跃”状态,它就会被划分至工作群组,例如用户常用的社交媒体应用。此外,该群组还包括了那些被间接使用的应用。
工作分组内的应用会在任务 (job) 运行和闹铃触发方面受到部分系统限制,详情请查阅《附件: 电量管理限制》。
>>《附件: 电量管理限制》链接:
https://developer.android.google.cn/preview/features/power-details
或
常用 (Frequent)
常用应用指用户经常使用但不是每天使用的应用,比如用户在健身房使用的打卡应用可能就属于这一群组。
系统对常用分组采用的限制更强,应用运行任务(job)和触发闹铃的能力都会受到影响,而且接受的高优先性FCM消息也有数量上限,详情请查阅《附件:电量管理限制》。
极少 (Rare)
若应用的使用频率很低,它就会被划分至该分组,酒店应用就是一个很好的例子——用户只有在下榻这个酒店的时候才会打开此应用。
该群组下的应用在任务 (job)、闹铃和高优先性FCM消息的资源调用上都会受到严格的限制。此外,网络访问能力也会受到影响。详情请阅读《附件:电量管理限制》。
最佳实践
如果您已经根据低耗电模式和应用待机模式的最佳实践对您的应用进行过相关优化,您应该能够轻松应对新的电量管理特性。不过,部分应用行为可能会受到此次特性变更的影响,无法继续正常运作。
请勿尝试操控系统将您的应用分配至某一特定群组。系统的分组规则可能会发生变化,而且设备厂商也可以根据自己的算法自行开发分组应用。开发者需要确保自己的应用在任何群组内都能够继续流畅运行。
如果应用没有 Launcher Activity,它可能永远都不会切换至活跃分组。开发者可能需要重新设计应用并添加此类activity。
如果应用的推送不具备可操作性,用户将无法借助与推送的交互将应用切换至活跃群组。在这种情况下,开发者可考虑重新设计推送功能,允许用户响应。具体操作指南,请参照 Material Design 中有关推送设计的章节。
若应用在接受高优先级的 FCM 消息之后未能发送推送,用户将无法与应用产生互动并将其优先级提升至 “活跃” 等级。其实,高优先级 FCM 消息的唯一用途就是向用户发送推送,因此这种情况绝对不应该出现。如果您错误的将没有与用户进行互动的 FCM 消息设置为高优先级,这种标记不当的行为可能会导致其他不良后果,比如:在应用耗尽高优先级消息额度之后,系统会把真正紧急的 FCM 消息当做“普通优先级”消息来处理。
>> Material Design 链接:
https://material.io/guidelines/patterns/notifications.html
*注意:如果用户多次忽略某条推送,系统会询问用户是否不再接受此推送。请开发者不要只是为了将应用保留在活跃群组,而向用户不断发送推送。
如果一个应用下面有多个包,这些包可能分别属于不同分组,各自的访问权限也有所不同。在测试环节时,请开发者先将包划分至不同分组,然后进行多次测试,确保应用行为无异常。
后台限制
当系统监测到应用消耗过多资源时,系统会通知并询问用户是否需要限制该应用的后台活动。目前有以下两种情况会触发系统发送此通知:
频繁使用唤醒锁 (wake locks):屏幕关闭后,局部唤醒锁 (Partial wake lock) 连续开启 1 小时;
过多的后台服务:当应用目标 API 等级低于 26,且运行过多后台服务。
设备厂商可自行决定具体采用的限制,比如:在 AOSP 构建上,除非受限应用运行在前台,否则它将无法运行任务 (job),触发闹铃或者访问网络。(请查阅《后台服务限制》了解如何判断应用是否为前台运行。) 详细限制列表,请查阅《附件:电量管理限制》。
>>《后台服务限制》链接:
https://developer.android.google.cn/about/versions/oreo/background.html#services
省电助手优化
Android P 进一步提升了省电模式的性能。由设备厂商来决定其采用的具体限制,比如:在AOSP构建上存在以下系统限制:
应用将更容易进入待机模式,系统不会一直等到应用处于“空闲”状态才采取行行动;
不论目标API等级为何,所有应用都会受到后台执行限制;
屏幕关闭后,位置服务可能被禁用;
处于后台的应用不能访问网络。
除此以外,Android P 还引入了多项针对设备的电量管理的优化,请阅读《附件:电量管理限制》获取进一步信息。
建议开发者在开启省电模式的情况下测试应用,您可在 Settings > Battery Saver 内手动开启省电模式:
低耗电模式
在低耗电模式下,应用对高耗电资源的使用权限将被推迟至下一个维护时段。具体限制请参照《附件:电量管理限制》。
进一步信息,请查阅《对低耗电模式和应用待机模式进行针对性优化》。
>>《对低耗电模式和应用待机模式进行针对性优化》链接:
https://developer.android.google.cn/training/monitoring-device-state/doze-standby.html
测试和错误排查
新的电量管理特性会影响在 Android P 上运行的所有应用,不论应用是否以 Android P 为目标平台开发。而开发者则需要保证自己的应用在设备上能够继续流畅运行,这一点至关重要。
请确保在多种电量优化功能的情况下对应用的主要用例进行测试。您可使用 Android Debug Bridge 命令开启或关闭部分特性。
>> Android Debug Bridge 链接:
https://developer.android.google.cn/studio/command-line/adb.html
使用 Android Debug Bridge 命令
您可使用 adb shell 命令来测试部分电量管理特性。
阅读《在低耗电模式和应用待机模式下进行应用测试》,了解如何在低耗电模式下使用 adb 命令。
>>《在低耗电模式和应用待机模式下进行应用测试》链接:
https://developer.android.google.cn/training/monitoring-device-state/doze-standby.html
应用待机分组
您可通过adb命令将应用手动划分至某一待机群组。输入以下命令,更改群组:
若想要同时对多个包进行群组设置,请输入:
输入以下命令,查看应用当下所处群组:
如果您没有传递 pasckagename 参数值,该命令将列出全部应用的群组。应用可通过调用 UsageStatsManager.getAppStandbyBucket(),查看在运行时所处的群组:
后台限制
手动执行后台限制,请输入以下命令:
取消后台限制,请输入以下命令:
省电模式
以下命令可以帮助开发者测试应用在低电量环境下的表现。
*注意:您也可以在 setting > Battery saver中,手动切换至省电模式
模拟设备断开充电状态,请输入:
测试应用在低电量状态下的表现,请输入:
完成测试之后,您可以通过以下命令将设置返回至测试前状态:
推荐阅读
· 开放, 玩心, 成功!与您相约 ChinaJoy 2018