В среднем пользователь Android устанавливает на свои устройства более 50 приложений (это число увеличивается с увеличением объема оперативной памяти). Однако значительная часть этих приложений долгое время остается неиспользованной.
Режим гибернации приложения переводит приложения, которые пользователь не использует в течение нескольких месяцев, аналогично автоматическому отзыву разрешений. Это принудительно останавливает приложение и переводит его в состояние, в котором оптимизация производится для экономии места, а не для повышения производительности. Автоматический отзыв разрешений также связан с этим состоянием, и для них используется одна и та же настройка исключений в параметрах . Принудительно остановленное приложение не запускает задачи или оповещения в фоновом режиме и не может отправлять push-уведомления. Когда пользователь снова использует приложение, оно выходит из режима гибернации, и задачи/оповещения/уведомления снова запускаются в обычном режиме. Все задачи/оповещения/уведомления, запланированные до перехода приложения в режим гибернации, необходимо перепланировать.
Модификация платформы производителями оборудования может привести к конфликту с реализацией режима гибернации приложений. Например.
- Изменение определения использования приложения или внедрение способов пробуждения приложения, отсутствующих в AOSP, может нарушить точность работы режима гибернации приложения.
- Собственный механизм ограничения производительности, аналогичный режиму гибернации приложений, может выполнять схожую функцию. Хотя оба механизма могут существовать, между ними может быть некоторое совпадение.
В документе CDD изложен новый набор требований к изменениям, основанным на использовании приложений, аналогичный существующему требованию 3.5.1 . Перевод приложений в спящий режим соответствует этим требованиям.
Код фреймворка находится в:
- репозиторий: platform/frameworks/base
- каталог: services/core/java/com/android/server/apphibernation
Логика политики заключается в следующем:
- репозиторий: platform/packages/modules/Permission
- каталог: PermissionController/src/com/android/permissioncontroller/hibernation
Архитектура высокого уровня
Служба гибернации приложений оптимизирует использование памяти для редко используемых приложений и предотвращает их работу в фоновом режиме. Для достижения этих результатов при переводе приложения в спящий режим мы, в частности, выполняем следующие действия:
- Автоматический отзыв разрешений
- Принудительно остановите приложение
- Удалите файлы ODEX и VDEX.
- Удалите кэш приложения.
Наша цель — реализовать обратимый режим гибернации, чтобы приложение оставалось доступным пользователю через Launcher и другие интерфейсы с сохранением данных приложения. После запуска приложения мы восстановим его из состояния принудительной остановки и продолжим создание файлов ODEX и VDEX в обычном режиме.
Запланированный проект основан на двух основных частях:
- Определение момента, когда посылке следует перейти в спящий режим.
- Оптимизация пакета для режима гибернации
В PermissionController добавлены новая системная служба AppHibernationService и служба заданий AppHibernationJobService, которые являются связующим звеном, управляющим общим процессом принятия решений и логикой.
Определение момента перехода пакета в спящий режим в основном осуществляется с помощью 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, это по сути просто автоматический отзыв разрешений.
Кроме того, производители оборудования могут внедрять аналогичную функцию. Однако эти функции ориентированы на гораздо более короткие сроки оптимизации энергопотребления, которые могут быть специфичными для каждого производителя. Любые аналогичные функции ограничения приложений, разработанные производителями оборудования, могут сосуществовать с системой спящего режима приложений, если они соответствуют существующим критериям, определенным в CDD .
Тестирование
Для обеспечения корректной работы режима гибернации приложения используются CTS и модульные тесты.
-
AutoRevokeTest -
AppHibernationIntegrationTest