Android 11 QPR3 或更高版本支持缓存应用冻结器。此功能会停止缓存进程的执行,并减少行为异常的应用(可能会尝试在缓存时运行)的资源用量。该框架通过将其进程迁移到冻结 cgroup 来冻结缓存应用;这减少了存在活动缓存应用时的主动和空闲 CPU 消耗。可以使用系统配置标志或开发者选项启用应用冻结器。
实现应用冻结器
缓存应用冻结器利用内核 cgroup v2 冻结器。搭载兼容内核的设备可以(选择性地)启用它。为此,请启用开发者选项“暂停缓存应用的执行”,或将设备配置标志 activity_manager_native_boot use_freezer
设置为 true
。例如
adb shell device_config put activity_manager_native_boot use_freezer true && adb reboot
当标志 use_freezer
设置为 false 或开发者选项被禁用时,冻结器将被禁用。您可以通过在软件版本或更新中更改设备配置来切换此设置。
应用冻结器不公开官方 API(并且没有参考实现客户端),但确实使用了隐藏的系统 API setProcessFrozen
和 enableFreezer
。有关这些 API 的详细信息,请参阅 ActivityManager 的 Process.java
和 ActivityManagerService API。开发者还可以参考 ActivityManager
中的客户端代码进行实验。
处理自定义功能
通常,进程在缓存时预计不会执行任何工作,但某些应用可能具有由预计在缓存时运行的进程支持的自定义功能。当在运行此类应用的设备上启用应用冻结器时,缓存的进程将被冻结,并可能阻止自定义功能正常运行。
作为一种解决方法,如果应用具有需要在缓存时执行活动的进程,请在进程需要执行任何工作之前,将进程状态更改为非缓存状态(例如,绑定前台服务 (BFGS) 或前台),以允许应用保持活动状态。
测试应用冻结器
要验证应用冻结器是否按预期工作,请使用以下资源
使用
adb shell dumpsys activity
命令检查冻结进程列表,并 grepApps frozen:
。检查是否存在
/sys/fs/cgroup/uid_0/cgroup.freeze
文件。查看 logcat,它显示了每次进程移入或移出冻结器时的冻结和取消冻结条目。例如
adb logcat | grep -i "\(freezing\|froze\)"