Android 11 QPR3 или более поздней версии поддерживает заморозку кэшированных приложений. Эта функция останавливает выполнение кэшированных процессов и снижает использование ресурсов за счет неправильного поведения приложений, которые могут пытаться работать во время кэширования. Фреймворк замораживает кешированные приложения, перенося их процессы в замороженную контрольную группу; это снижает активное и бездействующее потребление ЦП при наличии активных кэшированных приложений. Замораживатель приложений можно включить с помощью флага конфигурации системы или параметра разработчика.
Реализация заморозки приложений
Заморозка кэшированных приложений использует заморозку ядра 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 см. в Process.java
ActivityManager и API ActivityManagerService. Разработчики также могут обращаться к клиентскому коду в ActivityManager
для экспериментов.
Работа с пользовательскими функциями
Как правило, процессы не должны выполнять какую-либо работу при кэшировании, но некоторые приложения могут иметь настраиваемые функции, поддерживаемые процессами, которые должны выполняться при кэшировании. Когда на устройстве с таким приложением включена заморозка приложений, кэшированные процессы замораживаются и могут помешать работе пользовательских функций.
В качестве обходного пути, если в приложении есть процесс, который должен выполнять действия во время кэширования, измените статус процесса на некэшированный (например, Bound ForeGround Service (BFGS) или передний план), прежде чем процессу потребуется выполнить какую-либо работу, чтобы разрешить приложению оставаться активным.
Тестирование морозильной камеры приложений
Чтобы убедиться, что замораживатель приложений работает должным образом, используйте следующие ресурсы:
Проверьте список кешированных процессов в
/dev/freezer/frozen/cgroup.procs
.Проверьте наличие файла
/sys/fs/cgroup/uid_0/cgroup.freeze
.Просмотрите logcat, который показывает замороженные/размороженные записи каждый раз, когда процесс перемещается в морозильную камеру или из нее. Например:
adb logcat | grep -i "\(freeze\|froze\)"