В Android 9 (уровень API 28) представлены новые функции для улучшения управления питанием устройства. Эти изменения, наряду с функциями, которые уже присутствовали в предыдущих версиях, помогают обеспечить предоставление системных ресурсов приложениям, которые в них нуждаются больше всего.
Функции управления питанием делятся на две категории:
- Резервные сегменты приложений
- Система ограничивает доступ приложений к ресурсам устройства, таким как процессор или аккумулятор, в зависимости от особенностей использования пользователя. Это новая функция Android 9.
- Улучшения экономии заряда батареи
- Когда режим экономии заряда включен, система накладывает ограничения на все приложения. Это существующая функция, улучшенная в Android 9.
Резервные сегменты приложений
В Android 9 представлена новая функция управления зарядом батареи — App Standby Buckets. Резервные сегменты приложений помогают системе определять приоритетность запросов приложений на ресурсы в зависимости от того, как недавно и как часто они использовались. В зависимости от моделей использования приложений каждое приложение помещается в одну из пяти приоритетных групп. Система ограничивает ресурсы устройства, доступные каждому приложению, в зависимости от того, в каком сегменте оно находится.
Пять сегментов распределяют приложения по приоритетам в группы по следующим характеристикам:
- Активный
Приложение находится в активном сегменте, если пользователь в данный момент использует его, например:
- Приложение запустило активность
- Приложение запускает службу переднего плана
- В приложении есть адаптер синхронизации, связанный с поставщиком контента, используемым приложением переднего плана.
- Пользователь нажимает на уведомление из приложения
Если приложение находится в активном сегменте, система не налагает никаких ограничений на задания приложения, сигналы тревоги или сообщения FCM.
- Рабочий набор
Приложение находится в сегменте рабочего набора, если оно запускается часто, но в данный момент не активно. Например, приложение для социальных сетей, которое пользователь запускает большую часть времени, скорее всего, будет в рабочем наборе. Приложения также переводятся в корзину рабочего набора, если они используются косвенно.
Если приложение находится в рабочем наборе, система накладывает мягкие ограничения на его способность запускать задания и вызывать сигналы тревоги. Подробности см. в разделе Ограничения управления питанием .
- Частый
Приложение попадает в корзину частого использования, если оно используется регулярно, но не обязательно каждый день. Например, приложение для отслеживания тренировок, которое пользователь запускает в тренажерном зале, может находиться в сегменте частого использования.
Если приложение находится в частом сегменте, система налагает более строгие ограничения на его способность запускать задания и активировать сигналы тревоги, а также накладывает ограничение на высокоприоритетные сообщения FCM. Подробности см. в разделе Ограничения управления питанием .
- Редкий
Приложение попадает в корзину редких, если оно не используется часто. Например, приложение для отеля, которое пользователь запускает только во время пребывания в этом отеле, может оказаться в категории редких.
Если приложение находится в сегменте редких приложений, система накладывает строгие ограничения на его способность запускать задания, вызывать сигналы тревоги и получать высокоприоритетные сообщения FCM. Система также ограничивает возможность приложения подключаться к Интернету. Подробности см. в разделе Ограничения управления питанием .
- Никогда
Приложения, которые были установлены, но никогда не запускались, попадают в корзину «никогда». Система накладывает строгие ограничения на эти приложения.
Система динамически назначает каждому приложению приоритетный сегмент и переназначает приложения по мере необходимости. Система может полагаться на предварительно загруженное приложение, которое использует машинное обучение, чтобы определить вероятность использования каждого приложения, и распределяет приложения по соответствующим сегментам. Если системное приложение отсутствует на устройстве, система по умолчанию сортирует приложения в зависимости от того, как недавно они использовались. Более активные приложения назначаются сегментам, которые дают приложениям более высокий приоритет, предоставляя приложению больше системных ресурсов. В частности, сегмент определяет, как часто выполняются задания приложения, как часто приложение может вызывать сигналы тревоги и как часто приложение может получать высокоприоритетные сообщения Firebase Cloud Messaging (FCM) . Эти ограничения применяются только тогда, когда устройство работает от аккумулятора; система не накладывает эти ограничения на приложения во время зарядки устройства.
Каждый производитель может установить свои собственные критерии распределения неактивных приложений по сегментам. Не пытайтесь повлиять на то, к какому сегменту будет отнесено ваше приложение. Вместо этого сосредоточьтесь на том, чтобы убедиться, что ваше приложение хорошо ведет себя в любом сегменте, в котором оно находится. Ваше приложение может узнать, в каком сегменте оно находится в данный момент, вызвав новый метод UsageStatsManager.getAppStandbyBucket()
.
Лучшие практики
Если ваше приложение уже следует рекомендациям по Doze и режиму ожидания , использование новых функций управления питанием не должно вызвать затруднений. Однако некоторые варианты поведения приложений, которые раньше работали хорошо, теперь могут вызывать проблемы.
- Не пытайтесь манипулировать системой, чтобы поместить ваше приложение в ту или иную корзину. Методы группирования системы могут меняться, и каждый производитель устройств может написать собственное приложение для группирования со своим собственным алгоритмом. Вместо этого убедитесь, что ваше приложение ведет себя соответствующим образом независимо от того, в каком сегменте оно находится.
- Если у приложения нет активности средства запуска, оно может никогда не быть переведено в активный сегмент. Возможно, вы захотите изменить дизайн своего приложения, чтобы в нем была такая деятельность.
- Если уведомления приложения недействительны, пользователи не смогут инициировать продвижение приложения в активный сегмент, взаимодействуя с уведомлениями. В этом случае вы можете изменить дизайн некоторых соответствующих уведомлений, чтобы они позволяли пользователю отвечать. Некоторые рекомендации см. в шаблонах проектирования Material Design Notifications .
Аналогичным образом, если приложение не отображает уведомление при получении сообщения FCM с высоким приоритетом, оно не даст пользователю возможности взаимодействовать с приложением и, таким образом, перевести его в активную корзину. Фактически, единственное предполагаемое использование сообщений FCM с высоким приоритетом — это отправка уведомления пользователю, поэтому такая ситуация никогда не должна возникать. Если вы ненадлежащим образом пометите сообщение FCM как высокоприоритетное, хотя оно не вызывает взаимодействия с пользователем, это может привести к другим негативным последствиям; например, это может привести к тому, что ваше приложение исчерпает свою квоту, в результате чего действительно срочные сообщения FCM будут рассматриваться как сообщения с обычным приоритетом.
Примечание. Если пользователь неоднократно отклоняет уведомление, система предоставляет ему возможность заблокировать это уведомление в будущем. Не рассылайте пользователю спам-уведомления только для того, чтобы попытаться сохранить свое приложение в активной корзине!
Если приложения разделены на несколько пакетов, эти пакеты могут находиться в разных сегментах и, следовательно, иметь разные уровни доступа. Обязательно тестируйте такие приложения с пакетами, назначенными различным сегментам, чтобы убедиться, что приложение работает правильно.
Улучшения экономии заряда батареи
В Android 9 внесен ряд улучшений в режим экономии заряда батареи. Производитель устройства определяет точные налагаемые ограничения. Например, в сборках AOSP система применяет следующие ограничения:
- Система более агрессивно переводит приложения в режим ожидания, вместо того, чтобы ждать, пока приложение перейдет в режим ожидания.
- Ограничения на фоновое выполнение применяются ко всем приложениям, независимо от их целевого уровня API.
- Службы определения местоположения могут быть отключены при выключенном экране.
- Фоновые приложения не имеют доступа к сети.
Кроме того, существуют и другие оптимизации энергопотребления для конкретных устройств. Полную информацию см. на странице, описывающей ограничения управления питанием .
Как всегда, рекомендуется протестировать приложение, пока включена функция экономии заряда батареи. Вы можете включить режим экономии заряда вручную на экране «Настройки» > «Экономия заряда» устройства.
Тестирование и устранение неполадок
Новые функции управления питанием влияют на все приложения, работающие на устройствах Android 9, независимо от того, предназначены ли они для Android 9. Важно убедиться, что ваше приложение работает правильно на этих устройствах.
Обязательно протестируйте основные варианты использования вашего приложения в различных условиях, чтобы увидеть, как функции управления питанием взаимодействуют друг с другом. Вы можете использовать команды Android Debug Bridge для включения и выключения некоторых функций.
Команды Android Debug Bridge
Вы можете использовать команды оболочки Android Debug Bridge для тестирования некоторых функций управления питанием.
Информацию об использовании ADB для перевода устройства в режим Doze см. в разделе Тестирование с помощью Doze и App Standby .
Резервные сегменты приложений
Вы можете использовать ADB, чтобы вручную назначить свое приложение в корзину ожидания приложения. Чтобы изменить корзину приложения, используйте следующую команду:
$ adb shell am set-standby-bucket packagename active|working_set|frequent|rare
Вы также можете использовать эту команду для одновременной установки нескольких пакетов:
$ adb shell am set-standby-bucket package1 bucket1 package2 bucket2...
Чтобы проверить, в каком сегменте находится приложение, запустите
$ adb shell am get-standby-bucket [packagename]
Если вы не передадите параметр packagename , команда выведет список сегментов для всех приложений. Приложение также может узнать свой сегмент во время выполнения, вызвав новый метод UsageStatsManager.getAppStandbyBucket()
.
Экономия заряда батареи
Существует несколько команд для проверки того, как ваше приложение ведет себя в условиях низкого энергопотребления.
Чтобы имитировать отключение устройства, используйте команду
$ adb shell dumpsys battery unplug
Чтобы проверить, как устройство ведет себя в условиях низкого энергопотребления, используйте следующую команду:
$ adb shell settings put global low_power 1
После завершения тестирования вы можете отменить ручные настройки устройства с помощью этой команды:
$ adb shell dumpsys battery reset