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

В Android 11 QPR3 и выше поддерживается функция заморозки кэшированных приложений. Эта функция останавливает выполнение кэшированных процессов и снижает потребление ресурсов приложениями, которые могут пытаться работать с ошибками во время кэширования. Фреймворк замораживает кэшированные приложения, перенося их процессы в замороженную контрольную группу (cgroup); это снижает потребление ресурсов процессора в режиме ожидания и активности при наличии активных кэшированных приложений. Функция заморозки приложений может быть включена с помощью системного флага конфигурации или параметра разработчика.

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

Функция заморозки кэшированных приложений использует функцию заморозки 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 и grep для Apps frozen:

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

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

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