Заморозка кэшированных приложений

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\)"