Несколько библиотек и системных API могут получать wake-блокировки, которые относятся к вашему приложению. Это может затруднить идентификацию wake-блокировки в вашем приложении, которая может вызывать проблему. Если вы неправильно используете API, это может привести к тому, что ваше приложение будет удерживать wake-блокировку слишком долго, даже если вы не вызываете wake-блокировки API напрямую.
В этом документе перечислены некоторые распространенные имена wake lock, которые вы можете увидеть при использовании инструментов отладки wake lock . Вы также можете увидеть эти имена в отчете Android Vitals . В некоторых случаях wake lock может быть создан библиотекой или системным API. В других случаях есть причина, по которой инструмент скрывает имя wake lock, используемое вами в приложении. Вы можете использовать инструменты отладки для выявления неправильно работающих wake lock, а затем выполнить поиск имени wake lock в этом документе, чтобы определить, какой API может вызывать проблему и как ее решить.
В этом документе рассматриваются сценарии, в которых могут быть созданы wake-блокировки. В каждом случае, хотя wake-блокировка может быть создана какой-то другой библиотекой или API, блокировка приписывается приложению, вызвавшему этот API.
-
AlarmManager
- Аудио и медиа
- Облачное сообщение Firebase (FCM)
- Планировщик заданий
- Расположение
- WorkManager
-
_UNKNOWN
: отображается инструментами отладки, если имя блокировки пробуждения использует персональные данные (PII).
AlarmManager
AlarmManager
получает блокировки пробуждения и приписывает их вызывающему приложению. AlarmManager
получает блокировку пробуждения, когда срабатывает будильник, и снимает блокировку, когда метод onReceive()
трансляции будильника завершает выполнение.
Имена блокировки пробуждения
AlarmManager
создает блокировки пробуждения с именем *alarm*
. (Звездочки являются частью имени блокировки пробуждения, они не представляют собой подстановочные знаки.)
Рекомендация
Для оптимизации поведения сигнализации мы рекомендуем следующие методы:
- Используйте
AlarmManager
для оптимизации частоты расписания будильников. - Используйте будильники
RTC_WAKEUP
(которые пробуждают устройство) только при необходимости. - Минимизируйте использование оповещений и избегайте выполнения длительной работы в методе
onReceive()
.
Аудио и медиа
Media API могут получать wake-locks при записи или воспроизведении аудио. Wake-locks приписываются вызывающему приложению.
Имена блокировки пробуждения
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 или ниже функция Wake Lock будет называться:
*job*/@backup@/com.example.app/com.backup.BackupFileService
На устройствах под управлением Android 16 и выше функция Wake Lock будет называться:
*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 worker'ы получают wake locks во время выполнения задач в фоновом режиме. Wake locks приписываются приложению, которое создало worker'ов.
Имена блокировки пробуждения
Имена блокировок сна, получаемые 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 или ниже функция Wake Lock будет называться:
*job*/com.example.app/androidx.work.impl.background.systemjob.SystemJobService
На устройствах под управлением Android 16 и выше функция Wake Lock будет называться:
*job*e/#BackupFileWorker#/com.example.app/androidx.work.impl.background.systemjob.SystemJobService
Рекомендация
Проведите аудит использования WorkManager worker. В частности, следуйте нашим рекомендациям по оптимизации использования батареи для API планирования задач .
_НЕИЗВЕСТНЫЙ
Если инструменты отладки считают, что имя wake lock содержит персональную идентификационную информацию (PII), они не отображают фактическое имя wake lock. Вместо этого они помечают wake lock как _UNKNOWN
. Например, инструменты могут сделать это, если имя wake lock содержит адрес электронной почты.
Рекомендация
Следуйте рекомендациям по именованию wake lock и избегайте использования PII в имени wake lock. Если вы обнаружили wake lock с именем _UNKNOWN
, приписанный вашему приложению, попробуйте определить, какой это wake lock, и дайте ему другое имя.