End

性能 待机存储分区 Standby Bucket

本文地址


目录

App Standby Bucket

应用待机存储分区

App Standby Bucket

Android 9(API 级别 28)引入了新的电池管理功能(battery management feature):应用待机存储分区。应用待机存储分区有助于系统根据应用的使用时间新近度(recently)和使用频率(frequently)对应用资源请求确定优先级。 根据应用使用模式(usage patterns),每个应用都会被放置在五个优先级存储分区之一中。系统会根据应用所在的存储分区限制每个应用可用的设备资源。

Priority buckets

优先级存储分区

系统会动态地将每个应用分配到优先级存储分区,并根据需要重新分配应用。

系统可能依赖于某个预加载的应用,该应用使用机器学习判断每个应用将被使用的可能性,并将应用分配到相应的存储分区。如果设备上没有该系统应用,则系统会默认根据应用的使用时间新近度对应用进行排序。

系统会将更活跃的应用分配到赋予应用更高优先级的存储分区,为应用提供更多系统资源。具体而言,存储分区决定了应用的 jobs 运行频率,应用可以触发 alarms 的频率以及应用可以接收高优先级 Firebase Cloud Messaging 传递消息的频率。

这些限制仅适用于设备使用电池供电(battery power)的情况;在设备充电期间,系统不会对应用施加这些限制

注意:每个制造商(manufacturer )都可以针对将非活动应用分配到存储分区的方式设定自己的标准。您不应该试图影响(influence)应用分配到哪个存储分区,而应该专注于(focus on)确保您的应用在可能处于的任何存储分区中都运行良好。您的应用可以通过调用 UsageStatsManager.getAppStandbyBucket() 查明其当前所在的存储分区。

这些存储分区为:

Active: App is currently being used or was very recently used
Working set: App is in regular use
Frequent: App is often used, but not every day
Rare: App is not frequently used

  • Active:应用目前正在使用中,或者最近刚刚使用过
  • Working set:应用会定期使用
  • Frequent:应用会经常使用,但不会每天使用
  • Rare:应用不经常使用
  • never:已安装但从未运行过的应用,系统会对这些应用施加严格的限制

注意:低电耗模式白名单(exemption list)中的应用,不适用于基于 App Standby Bucket 的限制。

各存储分区的限制

注意:以下说明适用于非预测性(non-predictive)的情况。否则,当 prediction 使用机器学习预测行为时,会根据对用户后续操作的 anticipation(而不是使用时间的新近度)选择存储分区。例如,最近使用的应用可能会出现在 rare 存储分区中,因为机器学习预测该应用在数小时内不会使用。

Active

如果用户当前正在使用某个应用或最近刚刚使用过该应用,则该应用位于活跃存储分区中。例如:

  • 该应用启动了一个 Activity
  • 该应用正在运行一项前台(foreground)服务
  • 该应用具有与前台应用使用的 content provider 相关联的同步适配器(sync adapter)
  • 用户点击了应用通知

如果某个应用位于“活跃”存储分区中,系统不会对应用的 jobs, alarms, or FCM messages 施加任何限制。

Working set

如果某个应用经常运行,但当前未处于活跃状态,则该应用位于工作集存储分区中。例如,用户多数时候都会启动的社交媒体应用很可能位于工作集内。如果以间接(indirectly)的方式使用应用,这些应用也会被提升到工作集存储分区。

如果某个应用位于工作集内,系统会对其 run jobs and trigger alarms 的频率施加轻微的限制。如需了解详情,请参阅 Power management restrictions.

Frequent

如果某个应用会定期使用,但不一定每天使用,则该应用位于常用存储分区中。例如,用户在健身房运行的锻炼跟踪应用可能位于“常用”存储分区中。

如果某个应用位于“常用”存储分区中,则系统对其 run jobs and trigger alarms 的频率施加更严格的限制,还会对高优先级 FCM messages 设置上限。

Rare

不经常使用的应用位于极少使用存储分区中。例如,用户只有在入住酒店时才会运行的酒店应用可能就位于“极少使用”存储分区中。

如果某个应用位于“极少使用”存储分区中,则系统对其 run jobs and trigger alarms 以及接收高优先级 FCM messages 的频率施加严格的限制。系统还会限制应用连接到互联网的能力。

最佳做法

如果您的应用已经遵循低电耗模式和应用待机模式(Doze and app standby)的最佳做法,那么处理新的电源管理功能应该不难。不过,以前运行良好的某些应用行为现在可能会导致问题。

  • 不要试图迫使系统将您的应用放到某个特定的存储分区中。系统的分区方法可能会发生变化,并且每个设备制造商都可以选择使用自己的算法编写自己的分区应用。您应该确保您的应用无论位于哪个存储分区都运行正常。
  • 没有 launcher activity 的应用可能永远不会被提升到“活跃”存储分区。您可能需要重新设计应用,使其具有此类 Activity。
  • 如果应用的通知不可操作,用户将无法与通知互动,也就无法触发应用提升到“活跃”存储分区的操作。在这种情况下,您可能需要通过重新设计,使一些相应的通知允许用户做出响应。
  • 同样,如果应用在收到高优先级 FCM 消息时不显示通知,用户也没有机会与应用互动并促使系统将应用提升到“活跃”存储分区。事实上,高优先级 FCM 消息的唯一预期用途就是向用户推送通知,因此绝不应出现这种情况。如果您将不会触发用户互动的 FCM 消息误标为高优先级,可能会造成其他负面影响;例如,这会导致您的应用耗尽其配额,导致真正紧急的 FCM 消息被视为一般优先级。
  • 如果应用拆分为多个软件包,则这些软件包可能位于不同的存储分区中,并因此具有不同的访问权限级别。对于软件包会分配到不同存储分区的此类应用,您应该进行测试,以确保该应用运行正常。

注意:如果用户屡次忽略某个通知,系统会为用户提供以后屏蔽该通知的选项。不要仅仅为了让应用保持在“活跃”存储分区中而向用户发送大量通知!

2017-05-23

posted @ 2017-05-23 20:18  白乾涛  阅读(2833)  评论(1编辑  收藏  举报