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

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

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

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

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

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

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

Политическая логика живет в:

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

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

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

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

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