Android 11 QPR3 или выше поддерживает функцию заморозки кэшированных приложений. Эта функция останавливает выполнение кэшированных процессов и снижает использование ресурсов за счет некорректного поведения приложений, которые могут попытаться работать в кэше. Фреймворк замораживает кэшированные приложения, перенося их процессы в замороженную cgroup; это снижает потребление процессора в активном и неактивном режиме при наличии активных кэшированных приложений. Функция заморозки приложений может быть включена с помощью флага конфигурации системы или параметра разработчика.
Внедрить заморозку приложений
Freezer кэшированных приложений использует ядро cgroup v2 freezer. Устройства, поставляемые с совместимым ядром, могут (опционально) включить его. Для этого включите опцию разработчика "Suspend execution for cached apps" или установите флаг конфигурации устройства activity_manager_native_boot use_freezer
в true
. Например:
adb shell device_config put activity_manager_native_boot use_freezer true && adb reboot
Freezer отключается, когда флаг use_freezer
установлен на false или отключена опция разработчика. Вы можете переключить эту настройку, изменив конфигурацию устройства в выпуске или обновлении программного обеспечения.
Приложение Freezer не раскрывает официальные API (и не имеет клиентской реализации), но использует скрытые системные API setProcessFrozen
и enableFreezer
. Подробности об этих API см. в ActivityManager Process.java
и ActivityManagerService API. Разработчики также могут ссылаться на клиентский код в ActivityManager
для экспериментов.
Обработка пользовательских функций
Обычно от процессов не ожидается выполнения какой-либо работы при кэшировании, но некоторые приложения могут иметь пользовательские функции, поддерживаемые процессами, которые, как ожидается, будут выполняться при кэшировании. Когда на устройстве, на котором запущено такое приложение, включена функция заморозки приложений, кэшированные процессы замораживаются и могут помешать работе пользовательских функций.
В качестве обходного пути, если в приложении есть процесс, которому необходимо выполнять действия во время кэширования, измените статус процесса на «не кэшируется» (например, «Bound ForeGround Service (BFGS)» или «на переднем плане») до того, как процессу потребуется выполнить какую-либо работу, чтобы приложение оставалось активным.
Тест заморозки приложений
Чтобы проверить, работает ли заморозка приложений должным образом, воспользуйтесь следующими ресурсами:
Проверьте список замороженных процессов с помощью команды
adb shell dumpsys activity
и grep дляApps frozen:
Проверьте наличие файла
/sys/fs/cgroup/uid_0/cgroup.freeze
.Посмотрите logcat, который показывает замороженные и незамороженные записи каждый раз, когда процесс переходит в заморозку или из нее. Например:
adb logcat | grep -i "\(freezing\|froze\)"