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

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