应用待机存储分区

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

优先级存储分区

系统会动态地将每个应用分配到优先级存储分区,并根据需要重新分配应用。系统可能依赖于某个预加载的应用,该应用使用机器学习判断每个应用将被使用的可能性,并将应用分配到相应的存储分区。如果设备上没有该系统应用,则系统会默认根据应用的使用时间新近度对应用进行排序。系统会将更活跃的应用分配到赋予应用更高优先级的存储分区,为应用提供更多系统资源。具体而言,存储分区决定了应用的作业运行频率,应用可以触发警报的频率以及应用可以接收高优先级 Firebase 云消息传递 消息的频率。这些限制仅适用于设备使用电池供电的情况;在设备充电期间,系统不会对应用施加这些限制。

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

这些存储分区为:

此外,对于已安装但从未运行过的应用,还有一个特殊的 从未使用 存储分区。系统会对这些应用施加严格的限制。

注意 :基于应用待机模式存储分区的限制不适用于低电耗模式白名单中的应用。

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

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

  • 该应用启动了一个 Activity
  • 该应用正在运行一项前台服务
  • 该应用具有与前台应用使用的内容提供程序相关联的同步适配器
  • 用户点按了应用通知

如果某个应用位于“活跃”存储分区中,系统不会对应用的作业、警报或 FCM 消息施加任何限制。

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

如果某个应用位于工作集内,系统会对其运行作业和触发警报的频率施加轻微的限制。如需了解详情,请参阅 电源管理限制

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

如果某个应用位于“常用”存储分区中,则系统对其运行作业和触发警报的频率施加更严格的限制,还会对高优先级 FCM 消息设置上限。如需了解详情,请参阅 电源管理限制

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

如果某个应用位于“极少使用”存储分区中,则系统对其运行作业、触发警报以及接收高优先级 FCM 消息的频率施加严格的限制。 系统还会限制应用连接到互联网的能力。如需了解详情,请参阅 电源管理限制

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

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

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

  • 如果应用拆分为多个软件包,则这些软件包可能位于不同的存储分区中,并因此具有不同的访问权限级别。对于软件包会分配到不同存储分区的此类应用,您应该进行测试,以确保该应用运行正常。

应用待机存储分区有助于系统根据应用的使用时间新近度和使用频率对应用资源请求确定优先级

而分区算法可由设备制造商确认

存储分区为:

学习https://developer.android.google.cn/topic/performance/appstandby应用待机存储分区Android 9(API 级别 28)引入了新的电池管理功能:应用待机存储分区。应用待机存储分区有助于系统根据应用的使用时间新近度和使用频率对应用资源请求确定优先级。 根据应用使用模式,每个应用都会被放置在五个优先级存储分区之一中。系统会根据应用所在的存储分区限制每个应用可用的设备资源。优先级存储分区系统会动态地将每个应用分配到优先级存储. 省电模式是系统里的一个开关,开启后会降低设备的性能,限制后台 应用 的活动和数据同步(如邮件接收),并限制GPS访问。 用户可以主动开启省电模式,也可以设置电量少于一定程度是自动开启省电模式。 一般 Android 设备厂商的定制系统,还会提供超级省电模式,只允许必要的 app 运行,并断开数据连接。 设备连接到充电器的时候,一般情况下,系统会自动退出省电模式(定制系统可能行为会不一样)。 ......
Android 12 平台包含一些行为变更,这些变更可能会影响您的 应用 。以下行为变更将影响在 Android 12 上运行的所有 应用 ,无论采用哪种targetSdkVersion都不例外。您应该测试您的 应用 ,然后根据需要进行修改,以适当地支持这些变更。 此外,请务必查看仅影响以 Android 12 为目标平台的 应用 的行为变更列表。 拉伸滚动效果 在搭载 Android 12 及更高版本的设备上,滚动事件的视觉行为发生了变化。 在 Android 11 及更低版本中,滚动事件会使视觉..
Android P 在现有平台的功能基础上加入多项新特性以提升设备电量管理能力,确保系统对 应用 进行最合适的资源分配。 电量管理特性主要体现在以下四个方面: 1. 应用 待机 分组 Android P 新增 应用 待机 分组功能,让系统根据用户的使用情况而限制 应用 调用 CPU 或网络等设备资源。 2. 后台限制 Android P新增后台限制功能,若 应用 出现 Android Vitals 内所描述的不良行为...
行为变更:所有 应用 Android 12 平台包含一些行为变更,这些变更可能会影响您的 应用 。以下行为变更将影响在 Android 12 上运行的所有 应用 ,无论采用哪种targetSdkVersion都不例外。您应该测试您的 应用 ,然后根据需要进行修改,以适当地支持这些变更。 此外,请务必查看仅影响以 Android 12 为目标平台的 应用 的行为变更列表。 滚动事件的行为在 Android 12 中发生了变化。如需了解详情,请参阅滚动效果。 前台服务通知用户体验延迟 为了在..
Android9.x 应用 待机 群组特性导致后台 应用 无法联网问题分析9.x增加的电源管理新特性1 应用 分组2 查看和修改分组3 省电管理白名单源码分析 9.x增加的电源管理新特性 我们在工作中发现一个问题,我们的一个 应用 ,启动时只启动一个后台服务,而不会启动界面。并且在后台服务中网络请求超时。但是如果启动一个activity之后,就可以正常联网。 Android P(9.x)为了更加严格的限制后台 应用 ...
public class MainActivity extends AppCompatActivity { private static final int MSG_HEART = 100; private static final int HEART_DURATION = 5_000; private static File HEART_LOG_FILE; private Handler mHandler; https://perfetto.dev/docs/quickstart/android-tracing https://perfetto.dev/docs/concepts/config 之前看的https://ui.perfetto.dev/#!/record?p=instructions 其实就是开发者文档里的config文件 1.理论准备 perfetto普通模式的命令行 在普通模式下使用 perfetto 的一般语法如下: adb shell. (四十二)Context.startForegroundService() did not then call Service.startForeground? weixin_44163950: 没什么用。感觉这是系统问题。也不是必现 (两百五十六)学习perfetto(一) qq_28610379: adb shell 命令只能在模拟器上使用吗,真机使用各种没权限 (九十四) Android O 连接WiFi AP流程梳理续——连接网络 qq_32396387: 这个log在哪个文件夹下面 (一百零六)Android O wpa_supplicant driver初始化 weixin_38093093: @楼主,问题一提到的接口,wpa_driver_nl80211_driver_cmd