Определите блокировки пробуждения, созданные другими API.

Некоторые библиотеки и системные API могут получать блокировки пробуждения, относящиеся к вашему приложению. Это может затруднить выявление блокировки пробуждения в вашем приложении, которая может вызывать проблему. Неправильное использование API может привести к тому, что ваше приложение будет удерживать блокировку пробуждения слишком долго, даже если вы не вызываете API блокировки пробуждения напрямую.

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

В этом документе перечислены некоторые распространенные имена блокировок пробуждения, которые вы можете увидеть при использовании инструментов отладки блокировок пробуждения . Вы также можете увидеть эти имена в отчете от Vitals . В некоторых случаях блокировка пробуждения могла быть создана библиотекой или системным API. В других случаях существует причина, по которой инструмент скрывает имя блокировки пробуждения, используемое вами в приложении. Вы можете использовать инструменты отладки для выявления некорректно работающих блокировок пробуждения, а затем найти имя блокировки пробуждения в этом документе, чтобы определить, какой API может вызывать проблему и как ее решить.

В этом документе рассматриваются сценарии, в которых могут создаваться блокировки пробуждения. В каждом случае, хотя блокировка пробуждения может быть создана другой библиотекой или API, она приписывается приложению, которое вызвало этот API. На этой странице также описаны некоторые API, которые не создают блокировки пробуждения в ситуациях, когда вы могли бы ожидать их появления.

AlarmManager

AlarmManager получает блокировки пробуждения и назначает их вызывающему приложению. AlarmManager получает блокировку пробуждения, когда срабатывает будильник, и освобождает её, когда завершается выполнение метода onReceive() широковещательного сообщения будильника.

Названия замков пробуждения

AlarmManager создает блокировки пробуждения с именем *alarm* . (Звездочки являются частью имени блокировки пробуждения и не представляют собой подстановочные символы.)

Рекомендация

Для оптимизации работы системы оповещения мы рекомендуем следующие методы:

  • Используйте AlarmManager для оптимизации частоты срабатывания тревожных сигналов.
  • Используйте сигналы тревоги типа RTC_WAKEUP (которые пробуждают устройство) только при необходимости.
  • Сведите к минимуму использование оповещений и избегайте выполнения длительной работы в методе onReceive() .

Аудио и медиа

API для работы с медиафайлами могут получать блокировки пробуждения при записи или воспроизведении аудио. Блокировки пробуждения присваиваются вызывающему приложению.

Названия замков пробуждения

API для работы с медиафайлами получают блокировки пробуждения с различными именами, начинающимися с Audio :

  • AudioBitPerfect : Используется для воспроизведения аудио без потерь качества через USB.
  • AudioDirectOut : Используется для воспроизведения звука без потерь качества на телевизоре или специальном устройстве.
  • AudioDup : Используется для воспроизведения уведомлений при подключении через Bluetooth или USB.
  • AudioIn : Используется для захвата звука в режиме видеокамеры при активном микрофоне.
  • AudioMix : Используется для воспроизведения звука на распространенном устройстве.
  • AudioOffload : Используется для длительного воспроизведения только музыки в приложениях, поддерживающих этот режим.
  • AudioSpatial : Используется для воспроизведения многоканального звука фильмов или музыки на устройствах, поддерживающих пространственное звучание.
  • AudioUnknown : Используется, когда другие ситуации не применимы.
  • MmapCapture : Используется для захвата звука с низкой задержкой.
  • MmapPlayback : Используется для воспроизведения с низкой задержкой, например, в играх или в профессиональных аудиоприложениях.

Рекомендация

Мы рекомендуем следующие методы:

  • Не используйте имена блокировки пробуждения, начинающиеся с Audio .
  • Если вы используете API для работы с мультимедиа, вам не нужно получать блокировки пробуждения напрямую; вы можете положиться на API, которые сами получат необходимые блокировки пробуждения.
  • При использовании API для работы с медиафайлами завершайте сеанс работы с медиафайлами, когда он вам больше не нужен.

Bluetooth

API Bluetooth платформы не удерживают никаких блокировок пробуждения, связанных с приложением, во время выполнения действий Bluetooth. Чтобы убедиться, что передача данных по Bluetooth происходит в фоновом режиме, запланируйте задачу с помощью WorkManager.

Рекомендация

  • Используйте функцию сопряжения дополнительных устройств для подключения устройств Bluetooth, чтобы избежать ручной блокировки экрана во время сопряжения Bluetooth.
  • Для получения информации о том, как осуществлять фоновую связь по Bluetooth, обратитесь к руководству по настройке связи в фоновом режиме .
  • Если необходимо включить блокировку пробуждения вручную, удерживайте кнопку блокировки только на время действия Bluetooth.

Датчики устройства

Существует несколько методов отслеживания данных с датчиков устройства, таких как количество шагов, данные акселерометра или гироскопа.

В операционной системе Wear OS используйте Wear Health Services для получения данных с устройства, таких как высота над уровнем моря, частота сердечных сокращений и пройденное расстояние.

Если данные собираются другими приложениями, вы можете использовать Health Connect в сочетании с WorkManager для периодического получения этих данных.

Для таких сценариев, как отслеживание изменения количества шагов или пройденного расстояния, вы можете использовать API записи на мобильных устройствах в сочетании с WorkManager для периодического получения данных. Для доступа к историческим данным о шагах (например, к общему количеству шагов за день или количеству шагов за последние 6 часов) Health Connect также поддерживает отслеживание шагов на устройстве под управлением Android 14 или выше.

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

Рекомендация

Использование датчиков для записи с высокой частотой дискретизации может значительно разряжать батарею. Вот рекомендации по снижению расхода заряда батареи и использованию блокировки пробуждения:

  • При отслеживании количества шагов или пройденного расстояния используйте API записи для экономичной зарядки. Для устройств под управлением Android 14 и выше рассмотрите Health Connect для доступа к истории использования устройства и сводным данным о количестве шагов.
  • Для пассивного отслеживания местоположения с помощью датчиков на Wear OS используйте Wear Health Services для оптимизации расхода заряда батареи.
  • Снизьте частоту работы датчика до менее 200 Гц.
  • При регистрации датчика в SensorManager задайте значение maxReportLatencyUs более 30 секунд, чтобы использовать логику пакетной обработки данных с датчиков и уменьшить количество прерываний, получаемых приложением.
  • Избегайте удержания длительной блокировки сигнала пробуждения на протяжении всего времени отслеживания датчиков; вместо этого настройте оповещения с помощью AlarmManager таким образом, чтобы они опрашивали данные с датчиков каждые 30 секунд и более.

Firebase Cloud Message (FCM)

Блокировка пробуждения устанавливается во время отправки широковещательного сообщения Firebase Cloud Message (FCM) в приложение. Блокировка пробуждения снимается после завершения выполнения метода onMessageReceived() широковещательного сообщения FCM.

Названия замков пробуждения

Получена блокировка пробуждения с именем GOOGLE_C2DM .

Рекомендация

Для оптимизации работы FCM мы рекомендуем следующие методы:

  • Оптимизировать частоту подачи FCM.
  • Не используйте FCM с высоким приоритетом, если сообщение не требует немедленной доставки.
  • Метод onMessageReceived() должен завершаться как можно быстрее. Для получения дополнительной информации см. рекомендации Firebase .

JobScheduler

Задания JobScheduler получают блокировки пробуждения во время выполнения задач в фоновом режиме. Блокировки пробуждения приписываются приложению, создавшему эти рабочие процессы.

Названия замков пробуждения

Имена блокировок пробуждения, получаемые JobScheduler, зависят от версии операционной системы Android, на которой они работают, и от назначения задания.

Элементы, заключенные в угловые скобки, являются переменными. Например, "<package_name>" — это имя пакета вашего приложения, а не буквальный текст <package name> . Однако *job* — это последовательность символов *job* со звездочками; звездочки не используются в качестве подстановочных символов.

Android 15 и ниже

Задачи, инициированные пользователем, создают блокировки пробуждения с именами, соответствующими следующему шаблону:

*job*u/@<name_space>@/<package_name>/<classname>

В других профессиях используется подобная схема:

*job*/@<name_space>@/<package_name>/<classname>
Android 16 и выше

Задания, инициированные пользователем, создают блокировки пробуждения с именами, соответствующими следующему шаблону:

*job*u/@<name_space>@/#<trace_tag>#/<package_name>/<classname>

Для срочных заказов используется следующий шаблон:

*job*e/@<name_space>@/#<trace_tag>#/<package_name>/<classname>

В обычных рабочих местах используется следующая схема:

*job*r/@<name_space>@/#<trace_tag>#/<package_name>/<classname>
Пример

Предположим, существует ускоренное задание с пространством имен backup и started тегом трассировки. Имя пакета — com.example.app , а класс, создавший задание, — com.backup.BackupFileService .

На устройствах под управлением Android 15 или более ранних версий функция блокировки пробуждения будет называться следующим образом:

*job*/@backup@/com.example.app/com.backup.BackupFileService

На устройствах под управлением Android 16 и выше функция блокировки пробуждения будет называться следующим образом:

*job*e/@backup@/#started#/com.example.app/com.backup.BackupFileService

Рекомендация

Проведите аудит использования задач JobScheduler. В частности, следуйте нашим рекомендациям по оптимизации расхода заряда батареи при использовании API планирования задач .

Расположение

LocationManager и FusedLocationProviderClient используют блокировки пробуждения для получения и передачи местоположения устройства. Блокировки пробуждения назначаются приложению, которое вызвало эти API.

Названия замков пробуждения

Службы определения местоположения используют следующие названия:

  • CollectionLib-SigCollector
  • NetworkLocationLocator
  • NetworkLocationScanner
  • NlpCollectorWakeLock
  • NlpWakeLock
  • *location*

Рекомендация

  • Оптимизируйте использование определения местоположения . Например, установите тайм-ауты, обрабатывайте запросы на определение местоположения пакетами или используйте пассивные обновления местоположения.
  • Если вы используете API определения местоположения, вам не нужно получать блокировки пробуждения напрямую; вы можете положиться на API, которые сами получат необходимые блокировки пробуждения.

Менеджер работ

Во время выполнения задач в фоновом режиме рабочие процессы WorkManager получают блокировки пробуждения. Эти блокировки пробуждения приписываются приложению, создавшему эти рабочие процессы.

Названия замков пробуждения

Названия блокировок пробуждения, получаемые WorkManager, зависят от версии операционной системы Android, на которой они работают.

Android 15 и ниже

Задачи WorkManager создают блокировки пробуждения с именами, соответствующими следующему шаблону:

*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
Android 16 и выше

Для ускоренных задач создаются блокировки пробуждения с именами, соответствующими следующему шаблону:

*job*e/#<trace_tag>#/<package_name>/androidx.work.impl.background.systemjob.SystemJobService

Обычные задачи выполняются по следующей схеме:

*job*r/#<trace_tag>#/<package_name>/androidx.work.impl.background.systemjob.SystemJobService

По умолчанию <trace_tag> — это имя рабочего процесса.

Пример

Предположим, существует ускоренный обработчик с именем BackupFileWorker . Имя пакета — com.example.app .

На устройствах под управлением Android 15 или более ранних версий функция блокировки пробуждения будет называться следующим образом:

*job*/com.example.app/androidx.work.impl.background.systemjob.SystemJobService

На устройствах под управлением Android 16 или выше, использующих WorkManager 2.10.0+ , блокировка пробуждения будет называться следующим образом:

*job*e/#BackupFileWorker#/com.example.app/androidx.work.impl.background.systemjob.SystemJobService

Рекомендация

_НЕИЗВЕСТНЫЙ

Если отладочные инструменты считают, что имя блокировки пробуждения содержит персональные данные, они не отображают фактическое имя блокировки пробуждения. Вместо этого они помечают блокировку пробуждения как _UNKNOWN . Например, инструменты могут поступать так, если имя блокировки пробуждения содержит адрес электронной почты.

Рекомендация

Следуйте рекомендациям по именованию блокировок пробуждения и избегайте использования персональных данных в имени блокировки. Если вы обнаружите блокировку пробуждения с именем _UNKNOWN связанную с вашим приложением, попытайтесь определить, какая именно это блокировка, и дайте ей другое имя.