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

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

В этом документе перечислены некоторые распространённые имена блокировок пробуждения, которые вы можете встретить при использовании инструментов отладки . Эти имена также могут встречаться в отчёте Android Vitals . В некоторых случаях блокировка пробуждения может быть создана библиотекой или системным 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 завершайте медиа-сеанс, когда он вам больше не нужен.

Облачное сообщение Firebase (FCM)

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

Имена блокировок пробуждения

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

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

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

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

Планировщик заданий

Задания 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 используют Wake-блокировки для получения и предоставления данных о местоположении устройства. Wake-блокировки относятся к приложению, вызвавшему эти API.

Имена блокировок пробуждения

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

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

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

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

WorkManager

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

Имена блокировок пробуждения

Имена блокировок сна, получаемые 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 и выше функция блокировки сна будет называться:

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

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

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

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

If the debugging tools think a wake lock name contains personally identifiable information (PII), they don't display the actual wake lock name. Instead, they label the wake lock as _UNKNOWN . For example, tools might do this if the wake lock name contains an email address.

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

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