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) 或前台)保持活跃。
测试应用程序冰柜
要验证应用程序冷冻器是否按预期工作,请使用以下资源:
检查
/dev/freezer/frozen/cgroup.procs
中的缓存进程列表。检查
/sys/fs/cgroup/uid_0/cgroup.freeze
文件是否存在。查看 logcat,每次进程移入或移出冷冻机时,它都会显示冻结/解冻的条目。例如:
adb logcat | grep -i "\(freeze\|froze\)"