Некоторые библиотеки и системные API могут получать блокировки пробуждения, относящиеся к вашему приложению. Это может затруднить выявление блокировки пробуждения в вашем приложении, которая может вызвать проблему. Если вы неправильно используете API, это может привести к тому, что ваше приложение будет удерживать блокировку пробуждения слишком долго, даже если вы не вызываете API блокировки пробуждения напрямую.
В этом документе перечислены некоторые распространенные имена блокировки пробуждения, которые вы можете увидеть при использовании инструментов отладки блокировки пробуждения . Вы также можете увидеть эти имена в отчете Android Vitals . В некоторых случаях блокировка пробуждения могла быть создана библиотекой или системным API. В других случаях есть причина, по которой инструмент скрывает имя блокировки пробуждения, которое вы используете в приложении. Вы можете использовать инструменты отладки, чтобы выявить некорректно работающие блокировки пробуждения, а затем просмотреть имя блокировки пробуждения в этом документе, чтобы определить, какой API может быть причиной проблемы и как ее решить.
В этом документе описаны следующие имена блокировки пробуждения. В каждом случае, хотя блокировка пробуждения может быть создана какой-либо другой библиотекой или API, блокировка приписывается приложению, которое вызвало этот API.
-
*alarm*
: СозданоAlarmManager
. -
AudioIn
,AudioMix
: создается медиа-API. -
GOOGLE_C2DM
: получено при доставке облачного сообщения Firebase (FCM) в приложение. -
*job*/<package_name>/<package_and_job_name>
: создано заданиями JobScheduler. -
*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
: создано работниками WorkManager. -
NetworkLocationLocator
,FusedLocation
,*location*
: создается API-интерфейсами определения местоположения. -
_UNKNOWN
: отображается средствами отладки, если имя блокировки пробуждения использует личную информацию (PII).
*alarm*
Эта блокировка пробуждения получена AlarmManager
и приписана вызывающему приложению. AlarmManager
получает блокировку пробуждения, когда срабатывает сигнал тревоги, и снимает блокировку, когда метод onReceive()
широковещательной передачи сигнала тревоги завершает выполнение.
Рекомендация
Мы рекомендуем следующие методы для оптимизации поведения сигналов тревоги:
- Используйте
AlarmManager
для оптимизации частоты планирования сигналов тревоги. - Используйте сигналы тревоги
RTC_WAKEUP
(которые пробуждают устройство) только при необходимости. - Минимизируйте использование сигналов тревоги и избегайте длительной работы в методе
onReceive()
.
AudioIn
, AudioMix
и т. д.
Различные блокировки пробуждения, имена которых начинаются с Audio
приобретаются мультимедийными API при записи или воспроизведении звука. Блокировки пробуждения относятся к вызывающему приложению.
AudioIn
получается во время захвата AudioRecord
в режиме видеокамеры, когда микрофон активен. AudioMix
получается во время воспроизведения AudioTrack
на устройстве. Другие медиа-API могут приобретать блокировки пробуждения с другими именами, начинающимися с Audio
.
Рекомендация
Мы рекомендуем следующие практики:
- Не используйте имена блокировки пробуждения, начинающиеся с
Audio
. - Если вы используете медиа-API, вам не нужно напрямую получать блокировки пробуждения; вы можете положиться на API, которые помогут вам получить необходимые блокировки пробуждения.
- При использовании медиа-API завершите сеанс мультимедиа, когда он вам больше не нужен.
GOOGLE_C2DM
Эта блокировка пробуждения получается GCM при доставке облачного сообщения Firebase (FCM) в приложение. Блокировка пробуждения снимается после завершения выполнения метода onMessageReceived()
трансляции FCM.
Рекомендация
Мы рекомендуем следующие методы для оптимизации поведения FCM:
- Оптимизируйте частоту доставки FCM.
- Не используйте FCM с высоким приоритетом, если сообщение действительно не требуется доставить немедленно.
- Завершите выполнение метода
onMessageReceived()
как можно быстрее. Дополнительную информацию см. в руководстве Firebase .
*job*/<package_name>/<package_and_job_name>
Эти блокировки пробуждения используются заданиями JobScheduler при выполнении задач в фоновом режиме. Блокировки пробуждения относятся к приложению, создавшему рабочие процессы.
«<имя_пакета>» — это имя пакета вашего приложения, а не буквальный текст <package name>
. Аналогично, «<package_and_job_name>» — это имя пакета, за которым следует имя задания. *job*
— это последовательность символов *job*
со звездочками; звездочки не используются в качестве подстановочных знаков. Вот пример такого имени блокировки пробуждения:
*job*/com.example.app/com.example.app.example.path.ExampleJobService
Рекомендация
Проверяйте использование задач JobScheduler. В частности, следуйте нашим рекомендациям по оптимизации использования батареи для API планирования задач .
*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
Эти блокировки пробуждения используются работниками WorkManager при выполнении задач в фоновом режиме. Блокировки пробуждения относятся к приложению, создавшему рабочие процессы.
«<имя_пакета>» — это имя пакета вашего приложения, а не буквальный текст <package name>
. *job*
— это последовательность символов *job*
со звездочками; звездочки не используются в качестве подстановочных знаков.
Рекомендация
Проведите аудит использования работников WorkManager. В частности, следуйте нашим рекомендациям по оптимизации использования батареи для API планирования задач .
NetworkLocationLocator
, FusedLocation
, *location*
Эти имена блокировки пробуждения используются LocationManager
и FusedLocationProviderClient
для получения и доставки местоположения устройства. Блокировки пробуждения относятся к приложению, которое вызвало эти API.
Рекомендация
Оптимизируйте использование местоположения . Например, установите таймауты, пакетные запросы местоположения или используйте пассивное обновление местоположения.
_НЕИЗВЕСТНЫЙ
Если средства отладки считают, что имя блокировки пробуждения содержит личную информацию (PII), они не отображают фактическое имя блокировки пробуждения. Вместо этого они помечают блокировку пробуждения как _UNKNOWN
. Например, инструменты могут сделать это, если имя блокировки пробуждения содержит адрес электронной почты.
Рекомендация
Следуйте рекомендациям по именованию блокировки пробуждения и избегайте использования PII в имени блокировки пробуждения. Если вы обнаружите блокировку пробуждения с именем _UNKNOWN
, связанную с вашим приложением, попытайтесь определить, что это за блокировка пробуждения, и присвойте ей другое имя.