Спящий режим приложения

Средний пользователь Android устанавливает на свои устройства более 50 приложений (это число увеличивается с увеличением объёма оперативной памяти). Однако значительная часть этих приложений остаётся неиспользованной пользователем в течение длительного времени.

Режим гибернации приложения переводит приложения, которые пользователь не использует в течение нескольких месяцев, в режим гибернации, аналогично автоматическому отзыву разрешений. Это принудительно останавливает приложение и переводит его в состояние, в котором мы оптимизируем хранилище, а не производительность. Автоматический отзыв разрешений также связан с этим состоянием и использует один и тот же параметр исключения в настройках . Принудительно остановленное приложение не запускает задания или оповещения в фоновом режиме и не может отправлять push-уведомления. Когда пользователь снова использует приложение, приложение выходит из режима гибернации, и задания/оповещения/уведомления запускаются снова в обычном режиме. Любые задания/оповещения/уведомления, запланированные до перехода приложения в режим гибернации, необходимо перепланировать.

OEM-производители, модифицирующие платформу, могут конфликтовать с реализацией режима гибернации приложений. Например:

  • Изменение определения использования приложения или введение способов пробуждения приложения, не указанных в AOSP, может нарушить точность спящего режима приложения.
  • Фирменный механизм ограничения OEM-производителя, аналогичный спящему режиму приложений, может выполнять схожую функцию. Хотя оба механизма могут существовать, некоторые из них могут пересекаться.

В CDD изложен новый набор требований к изменениям, основанным на использовании приложений, аналогичный существующему требованию версии 3.5.1 . Спящий режим приложений соответствует этим требованиям.

Код фреймворка находится в:

Логика политики заключается в следующем:

  • репозиторий: платформа/пакеты/модули/разрешение
  • каталог: PermissionController/src/com/android/permissioncontroller/hibernation

Высокоуровневая архитектура

Системная служба спящего режима приложений оптимизирует хранилище для редко используемых приложений пользователя и предотвращает их запуск в фоновом режиме. Для достижения этих результатов при переводе приложения в спящий режим мы выполняем следующие действия:

  • Автоматический отзыв разрешений
  • Принудительная остановка приложения
  • Удалить файлы ODEX и VDEX
  • Удалить кэш приложения

Наша цель — реализовать гибернацию как обратимое действие, чтобы приложение оставалось доступным пользователю через Launcher и другие интерфейсы с нетронутыми данными. После запуска приложения мы восстановим его из состояния принудительной остановки и продолжим создание файлов ODEX и VDEX в обычном режиме.

Планируемый проект сосредоточен вокруг двух основных частей:

  • Определение того, когда пакет должен перейти в спящий режим
  • Оптимизация спящего пакета

Новая системная служба AppHibernationService и служба заданий AppHibernationJobService, в PermissionController являются связующим звеном, которое управляет общим принятием решений и логикой.

Определение времени перехода пакета в спящий режим в первую очередь осуществляется службой UsageStatsService и управляется службой AppHibernationJobService в PermissionController . Эта логика политики находится в PermissionController и позволяет нам динамически обновлять данные через Mainline. Кроме того, мы планируем добавить новый сигнал «Использование компонента» для отслеживания использования компонентов пакета (например, служб, поставщиков контента) в качестве новой метрики в UsageStatsService .

Оптимизация пакета — это то, где происходит вся реальная экономия и оптимизация. AppHibernationService взаимодействует с различными частями системы, чтобы остановить пакет, удалить данные кэша, удалить артефакты ART и так далее. Отзыв разрешений инициируется непосредственно из AppHibernationJobService для сохранения функции автоматического отзыва разрешений на устройствах Android 11 и более ранних версиях.

Пользовательский опыт

Пользователю предоставляется как информация, так и элементы управления тем, какие приложения можно перевести в спящий режим.

Подобно функции автоматического отзыва, пользователь получает уведомление о том, какие приложения находятся в спящем режиме, и имеет возможность перейти в настройки непосредственно из уведомления, чтобы либо открыть приложение и вывести его из спящего режима, либо удалить неиспользуемое приложение при необходимости.

Мы по-прежнему поддерживаем намерение разработчика запросить у пользователя освобождение от режима гибернации с существующим намерением автоматического отзыва разрешений.

Обратная совместимость

Функции, связанные с режимом гибернации, доступны начиная с Android 12. В более ранних версиях эта функция не работала из-за отсутствия соответствующих компонентов платформы (например, новой системной службы). Автоматический отзыв продолжает работать так же, как и в предыдущих версиях ОС.

Начиная с Android 12, для обеспечения обратной совместимости на странице приложения в разделе «Приложения и уведомления» в настройках добавлен переключатель режима гибернации, при этом оригинальный переключатель автоматического отзыва в подменю «Разрешения» сохранился. Этот переключатель управляет общим исключением из режима гибернации для приложения.

Настройка

Часть реализации является частью модульного компонента системы, поэтому партнёрам не рекомендуется вносить изменения в эту функцию. Вместо этого партнёры могут реализовать аналогичные функции или возможности, соблюдая требования CDD.

Режим гибернации приложений должен быть по умолчанию включен для всех приложений, предназначенных для Android 11 и более поздних версий. Это то же самое, что и автоматический отзыв разрешений. Хотя сам параметр может быть включен, реализация режима гибернации может различаться в приложениях для Android 11 и Android 12. В частности, режим гибернации приложений работает только для приложений, предназначенных для Android 11, тогда как для приложений для Android 12 это, по сути, просто автоматический отзыв.

Кроме того, OEM-производители могут реализовывать аналогичную функцию. Однако эти функции рассчитаны на гораздо более короткие сроки оптимизации работы аккумулятора, что может быть обусловлено спецификой OEM-производителя. Любые аналогичные функции ограничения приложений, разработанные OEM-производителями, могут сосуществовать с системой гибернации приложений, если они соответствуют критериям, определенным в CDD .

Тестирование

Для обеспечения корректной работы спящего режима приложения предусмотрены CTS и модульные тесты.