Средний пользователь Android устанавливает на свои устройства более 50 приложений (это число увеличивается с увеличением объёма оперативной памяти). Однако значительная часть этих приложений остаётся неиспользованной пользователем в течение длительного времени.
Режим гибернации приложения переводит приложения, которые пользователь не использует в течение нескольких месяцев, в режим гибернации, аналогично автоматическому отзыву разрешений. Это принудительно останавливает приложение и переводит его в состояние, в котором мы оптимизируем хранилище, а не производительность. Автоматический отзыв разрешений также связан с этим состоянием и использует один и тот же параметр исключения в настройках . Принудительно остановленное приложение не запускает задания или оповещения в фоновом режиме и не может отправлять push-уведомления. Когда пользователь снова использует приложение, приложение выходит из режима гибернации, и задания/оповещения/уведомления запускаются снова в обычном режиме. Любые задания/оповещения/уведомления, запланированные до перехода приложения в режим гибернации, необходимо перепланировать.
OEM-производители, модифицирующие платформу, могут конфликтовать с реализацией режима гибернации приложений. Например:
- Изменение определения использования приложения или введение способов пробуждения приложения, не указанных в AOSP, может нарушить точность спящего режима приложения.
- Фирменный механизм ограничения OEM-производителя, аналогичный спящему режиму приложений, может выполнять схожую функцию. Хотя оба механизма могут существовать, некоторые из них могут пересекаться.
В CDD изложен новый набор требований к изменениям, основанным на использовании приложений, аналогичный существующему требованию версии 3.5.1 . Спящий режим приложений соответствует этим требованиям.
Код фреймворка находится в:
- репозиторий: платформа/фреймворки/база
- каталог: services/core/java/com/android/server/apphibernation
Логика политики заключается в следующем:
- репозиторий: платформа/пакеты/модули/разрешение
- каталог: 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 и модульные тесты.
-
AutoRevokeTest
-
AppHibernationIntegrationTest