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

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) или передний план), прежде чем процессу потребуется выполнить какую-либо работу, чтобы разрешить приложению оставаться активным.

Проверьте заморозку приложений

Чтобы убедиться, что замораживатель приложений работает должным образом, используйте следующие ресурсы:

  • Проверьте список замороженных процессов с помощью команды adb shell dumpsys activity и введите ключевое слово Frozen .

  • Проверьте наличие файла /sys/fs/cgroup/uid_0/cgroup.freeze .

  • Просмотрите logcat, который показывает замороженные и незамороженные записи каждый раз, когда процесс мигрирует в морозильник или из него. Например:

    adb logcat | grep -i "\(freezing\|froze\)"