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