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

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

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

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

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