Contents
电源管理
Android 9(API 28)引入了一个改进电源管理的新的功能。这些功能和之前版本的功能帮助系统把资源分配给最需要他的那些应用。
电源管理的功能分为两类:
应用待机群组
系统根据应用的使用模式控制其对CPU、电源等系统资源的使用。这是Android 9的新功能。
省电改进
当省电功能打开时,系统限制所有应用。这是一个已有功能,Android 9对他作了改进。
注意:这些限制适用所有应用,不管应用是否基于Android 9。
应用待机群组
Android 9引入了一个新的电源管理功能:应用待机群组。应用待机群组使得系统基于应用最近被使用的频率来分配应用对资源的请求。基于应用的使用模式,每个应用都被分配到五个群组之一。系统基于应用所在群组限制其对资源的使用。
基于以下特性得出的五个群组
活动的
如果用户正在使用那个应用,则该应用在活动的群组,比如:
- 应用启动了一个Activity组件
- 应用正在运行一个前台服务
- 应用的content provider组件正在被前台应用所使用
- 用户点击了应用的一个通知
如果应用在活动群组,系统对应用的jobs,alarm和FCM消息都没有任何限制
工作集
如果一个应用经常运行但当前不再运行状态,那么他就在工作集群组。例如:用户经常使用的社交媒体应用就应该归到工作集集群中。被间接使用的应用也被归到工作集群组中。
工作集群组中的应用,系统对他们在运行job和触发alarm上有比较少的限制。具体请看电源管理限制。
经常
如果一个应用经常被使用但不一定天天用,那么他就倾向于归为经常群组。例如,一个运动记录应用,用户在健身房运行的应用就很可能归为经常群组。
经常群组的应用,系统对其运行job和触发alarm有较强的限制,并在高优先级的FCM消息方面也有限制。详情请看电源管理限制。
很少
不经常使用的应用被归为很少群组。例如,一个酒店应用,只有用户住酒店的时候才使用,就倾向于归为很少群组。
很少群组的应用,系统在运行job,触发alarm,接受高优先级FCM消息方面都有很强的限制。系统还会限制这些应用连接网络。详情请看电源管理限制。
从不
应用安装后从未运行过,这些应用被分到从不群组。系统对其进行极为严厉的限制。
系统对每个应用动态分配群组,并在需要时调整应用所在群组。系统可以依靠一个预装的应用,这个应用用机器学习建立每个应用被使用的频率数据,系统用这个数据分配应用的群组。如果这个系统应用不存在,那么系统默认按照应用最近被使用的情况对他们进行排序。最活跃的应用被分配到最高优先级,资源最充沛的群组。具体来说,群组决定了应用运行job,触发alarm和接受高优先级FCM消息的频率。这些限制只有在手机使用电源的时候存在,充电时没有这些限制。
厂商可以设置自己的标准,来管理应用活跃程度和群组的匹配关系。你不应影响自己应用所在群组,而是要保证不管在哪个群组,应用都能正常工作。应用可以知道自己当前在哪个群组,调用UsageStatsManager.getAppStandbyBucket()即可。
注意:Doze白名单的应用不受群组限制。
最佳实践
如果你的应用已经满足Doze和app standby了,新用能应该不难。但是,有些应用的行为之前可能没问题,新功能后却不一定。
- 不要试图操作系统,让你的应用从一个群组移到另一个群组。系统群组方法可能改变,厂商也可以基于自己的算法建立自己的群组应用。反倒是应该确保不管在哪个群组都能正常工作。
- 如果应用没有启动Activity,很有可能他永远不会进入活动群组。你可能希望重新写你的应用,让他有这样一个Activity。
- 如果你的通知没有触发其他动作,用户就不能通过通知触发应用到活动群组。这种情况下,你可能需要重新设计一些通知,让用户通过点击这些通知改变应用群组。更多信息,请看设计材料通知设计模式。
- 相似的,如果应用收到一个高优先级的FCM消息后没有显示通知,用户就没有机会与应用交互,从而让应用进入活动群组。实际上,高优先级消息的唯一用途就是给用户一个通知,所以这种情况不应该发生。如果本不需要用户交互的通知被你错误的标记成高优先级FCM消息,可能回导致其他后果,例如,这将耗尽应用的定额,让真正紧急的FCM消息被当成普通优先级消息对待。
注意:如果用户重复删除一个通知,系统会给用户一个选择将来禁止那条通知。不要为了让你的应用处在活动群组而滥用通知。
- 如果应用被分到结个包里,那么这些包可能会被分到不同的群组,有不同的系统资源使用限制。你要保证这些包在不同的群组里,程序能正常工作。
省电改进
Android 9对省电模式有了一系列改进。厂商决定如何实施这些限制。例如,在AOSP的系统中,系统使用了如下限制:
- 不像以前等到应用进入idle模式才将其放入应用standby模式,而是更激进些。
- 后台限制适用所有应用,不管目标API设成多少。
- 屏幕关掉后,位置服务可能就不能用了。
- 后台应用没有网络权限了。
除此之外,还有其他专门针对设备的电源优化。全面细节参考附件:电源管理限制。
像以前一样,省电功能激活时,测试应用是否工作,是个不错的主意。你可以通过Settings->Battery Saver手动启动省电功能。
测试和错误检查
新的电源管理的功能适用于所有应用,不管目标API是否Android 9。确保你的应用在装载了Android 9的设备上工作合理。
在各种情况下,确保你的应用在电源管理功能下都能合理工作。你可以用ADB命令打开或关闭一些功能。
ADB 命令
你可以用ADB命令测试一些电源管理的功能。
用ADB把你的手机设成Doze模式,请看测试Doze和应用standby。
应用待机群组
用ADB命令为你的应用分配、切换群组。
$ 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()得到自己所在群组。
省电
有一些命令来测试你的应用在低电的情况下工作状况。
注意:你也可以用设置->省电屏幕把设备设成省电模式。
为了模拟不在充电状态,用命令
$ adb shell dumpsys battery unplug
测试低电量状态下设备的工作状况,用命令:
$ adb shell settings put global low_power 1
完成测试后,恢复你的手动设置,用命令:
$ adb shell dumpsys battery reset