Некоторые библиотеки и системные API могут получать блокировки пробуждения, связанные с вашим приложением. Это может затруднить выявление блокировки пробуждения в вашем приложении, которая может быть причиной проблемы. Неправильное использование API может привести к тому, что приложение будет удерживать блокировку пробуждения слишком долго, даже если вы не вызываете API блокировки пробуждения напрямую.
В сценариях, где блокировка пробуждения выполняется другими API, следует избегать ручного получения блокировки пробуждения.
В этом документе перечислены некоторые распространённые имена блокировок пробуждения, которые вы можете встретить при использовании инструментов отладки . Вы также можете увидеть эти имена в отчёте Vitals . В некоторых случаях блокировка пробуждения может быть создана библиотекой или системным API. В других случаях инструмент может скрывать имя блокировки пробуждения, используемое в приложении, по какой-то причине. Вы можете использовать инструменты отладки для выявления некорректно работающих блокировок пробуждения, а затем найти имя блокировки пробуждения в этом документе, чтобы определить, какой API может вызывать проблему и как её решить.
В этом документе рассматриваются сценарии, в которых могут быть созданы блокировки пробуждения. В каждом случае, хотя блокировка пробуждения может быть создана какой-либо другой библиотекой или API, она приписывается приложению, вызвавшему этот API.
- AlarmManager
- Аудио и медиа
- Bluetooth
- Датчики устройств
- Облачное сообщение Firebase (FCM)
- Планировщик заданий
- Расположение
- WorkManager
-
_UNKNOWN
: отображается инструментами отладки, если имя блокировки пробуждения, по-видимому, использует персональную информацию (PII).
AlarmManager
AlarmManager
получает блокировку пробуждения и приписывает её вызывающему приложению. AlarmManager
получает блокировку пробуждения при срабатывании будильника и снимает её после завершения выполнения метода onReceive()
трансляции будильника.
Имена блокировок пробуждения
AlarmManager
создает запретные блокировки с именем *alarm*
. (Звездочки являются частью имени запретной блокировки, они не представляют собой подстановочные знаки.)
Рекомендация
Для оптимизации поведения сигнализации мы рекомендуем следующие методы:
- Используйте
AlarmManager
для оптимизации частоты расписания сигналов тревоги. - Используйте сигналы тревоги типа
RTC_WAKEUP
(которые пробуждают устройство) только при необходимости. - Минимизируйте использование оповещений и избегайте выполнения длительной работы в методе
onReceive()
.
Аудио и медиа
API-интерфейсы медиа могут устанавливать блокировки пробуждения при записи или воспроизведении звука. Блокировки пробуждения относятся к вызывающему приложению.
Имена блокировок пробуждения
API-интерфейсы мультимедиа получают блокировки пробуждения с различными именами, начинающимися с Audio
:
-
AudioBitPerfect
: используется для воспроизведения звука без потерь через USB. -
AudioDirectOut
: используется для воспроизведения звука без потерь на телевизоре или специальном устройстве. -
AudioDup
: используется для воспроизведения уведомлений при подключении через Bluetooth или USB. -
AudioIn
: используется для захвата звука в режиме видеокамеры, когда микрофон активен. -
AudioMix
: используется для воспроизведения звука на общем устройстве. -
AudioOffload
: используется для длительного воспроизведения только музыки для приложений, поддерживающих этот режим. -
AudioSpatial
: используется для воспроизведения многоканального звука фильмов или музыки на устройствах, поддерживающих пространственное аудио. -
AudioUnknown
: используется, когда другие ситуации не применимы. -
MmapCapture
: используется для захвата звука с малой задержкой. -
MmapPlayback
: используется для воспроизведения с малой задержкой, например, в играх или профессиональных аудиоприложениях.
Рекомендация
Мы рекомендуем следующие практики:
- Не используйте имена блокировок пробуждения, начинающиеся с
Audio
. - Если вы используете API-интерфейсы мультимедиа, вам не придется напрямую получать блокировку пробуждения; вы можете положиться на API, которые получат необходимые блокировки пробуждения.
- При использовании медиа-API завершайте медиа-сеанс, когда он вам больше не нужен.
Bluetooth
API Bluetooth платформы не блокируют пробуждение, связанное с приложением, во время выполнения действий Bluetooth. Чтобы убедиться, что передача данных по Bluetooth происходит в фоновом режиме, запланируйте задачу с помощью WorkManager.
Рекомендация
- Используйте сопряжение сопутствующих устройств для сопряжения устройств Bluetooth, чтобы избежать необходимости ручной блокировки режима сна во время сопряжения по Bluetooth.
- Ознакомьтесь с руководством по фоновому общению по Bluetooth, чтобы узнать, как организовать фоновое общение.
- Если необходима ручная блокировка режима сна, удерживайте ее только на время действия Bluetooth.
Датчики устройств
Существует несколько методов отслеживания данных датчиков устройства, таких как количество шагов, данные акселерометра или гироскопа.
В Wear OS используйте Wear Health Services для сбора данных устройства, таких как высота над уровнем моря, частота сердечных сокращений и пройденное расстояние.
Если данные собираются другими приложениями, вы можете использовать Health Connect в сочетании с WorkManager для извлечения данных.
Для таких сценариев, как отслеживание разницы шагов или пройденного расстояния, вы можете использовать API записи на мобильном устройстве в сочетании с WorkManager для извлечения данных.
В определённых ситуациях может потребоваться отслеживание датчиков устройства с помощью SensorManager
. SensorManager
не получает блокировок пробуждения от имени приложения, если только датчик не является датчиком пробуждения, который можно определить с помощью API isWakeUpSensor
.
Рекомендация
Использование датчиков для записи с высокой частотой дискретизации может существенно разрядить батарею. Ниже приведены рекомендации по снижению разряда батареи и использованию блокировки пробуждения:
- Если вы отслеживаете количество шагов или пройденное расстояние, используйте API записи для записи данных с экономным расходом заряда батареи.
- Для пассивного отслеживания датчиков на Wear OS используйте Wear Health Services , чтобы оптимизировать использование батареи.
- Уменьшите частоту датчика до менее 200 Гц.
- При регистрации датчика с помощью
SensorManager
определитеmaxReportLatencyUs
более 30 секунд, чтобы использовать логику пакетной обработки датчиков и сократить количество прерываний, получаемых приложением. - Избегайте удержания длительной блокировки в течение всего времени отслеживания датчика, вместо этого запланируйте сигналы тревоги с помощью AlarmManager для опроса данных датчика каждые 30+ секунд.
Облачное сообщение Firebase (FCM)
Блокировка пробуждения устанавливается при отправке широковещательного сообщения Firebase Cloud Message (FCM) приложению. Блокировка пробуждения снимается после завершения выполнения метода onMessageReceived()
широковещательного сообщения FCM.
Имена блокировок пробуждения
Блокировка пробуждения приобретается с именем 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 или ниже функция блокировки сна будет называться:
*job*/@backup@/com.example.app/com.backup.BackupFileService
На устройствах под управлением Android 16 и выше функция блокировки сна будет называться:
*job*e/@backup@/#started#/com.example.app/com.backup.BackupFileService
Рекомендация
Проверьте использование задач JobScheduler. В частности, следуйте нашим рекомендациям по оптимизации расхода заряда батареи для API планирования задач .
Расположение
LocationManager
и FusedLocationProviderClient
используют Wake-блокировки для получения и предоставления данных о местоположении устройства. Wake-блокировки относятся к приложению, вызвавшему эти API.
Имена блокировок пробуждения
Службы определения местоположения используют следующие названия:
-
CollectionLib-SigCollector
-
NetworkLocationLocator
-
NetworkLocationScanner
-
NlpCollectorWakeLock
-
NlpWakeLock
-
*location*
Рекомендация
- Оптимизируйте использование данных о местоположении . Например, установите тайм-ауты, пакетные запросы на определение местоположения или используйте пассивные обновления данных о местоположении.
- Если вы используете API определения местоположения, вам не нужно напрямую получать блокировку пробуждения; вы можете положиться на API, которые получат необходимые блокировки пробуждения.
WorkManager
Воркеры WorkManager получают блокировку пробуждения (wake locks) во время выполнения задач в фоновом режиме. Блокировки пробуждения присваиваются приложению, создавшему эти воркеры.
Имена блокировок пробуждения
Имена блокировок сна, получаемые 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 или ниже функция блокировки сна будет называться:
*job*/com.example.app/androidx.work.impl.background.systemjob.SystemJobService
На устройствах под управлением Android 16 или выше, использующих WorkManager 2.10.0+
, функция блокировки сна будет называться:
*job*e/#BackupFileWorker#/com.example.app/androidx.work.impl.background.systemjob.SystemJobService
Рекомендация
- Обновите версию WorkManager, чтобы сделать теги блокировки сна более подробными на Android 16 и выше.
- Проведите аудит использования WorkManager Worker. В частности, следуйте нашим рекомендациям по оптимизации расхода заряда батареи для API планирования задач .
_НЕИЗВЕСТНЫЙ
Если инструменты отладки считают, что имя блокировки пробуждения содержит персональную информацию (PII), они не отображают фактическое имя блокировки пробуждения. Вместо этого они помечают блокировку пробуждения как _UNKNOWN
. Например, инструменты могут сделать это, если имя блокировки пробуждения содержит адрес электронной почты.
Рекомендация
Следуйте рекомендациям по именованию блокировок пробуждения и избегайте использования персональных данных (PII) в названии блокировки пробуждения. Если вы обнаружили блокировку пробуждения с именем _UNKNOWN
, приписанную вашему приложению, попробуйте определить, какая именно это блокировка пробуждения, и присвойте ей другое имя.