Примеры из практики
Как WHOOP сократил количество чрезмерно частичных сеансов блокировки экрана более чем на 90%.
4 минуты чтения

Разработка Android-приложения для носимого устройства означает, что настоящая работа начинается, когда экран выключается. WHOOP помогает пользователям понять, как их организм реагирует на тренировки, восстановление, сон и стресс, и для многих пользователей WHOOP на Android надежная фоновая синхронизация и подключение к сети делают эти данные возможными.
В начале этого года Google Play представил новый показатель в Android Vitals : чрезмерное использование частичных блокировок пробуждения. Этот показатель измеряет процент пользовательских сессий, в которых суммарное использование блокировок пробуждения, не подпадающих под исключения, превышает 2 часа за 24 часа. Цель этого показателя — помочь выявить и устранить возможные источники разряда батареи, что крайне важно для обеспечения отличного пользовательского опыта.
Начиная с 1 марта 2026 года, приложения, которые по-прежнему не соответствуют пороговым значениям качества, могут быть исключены из результатов поиска Google Play. Также в описании приложения в Google Play Store может появиться предупреждение о том, что приложение может потреблять больше заряда батареи, чем ожидалось.
По словам Маянка Саини, старшего Android-разработчика в WHOOP, это «предоставило команде возможность повысить эффективность Android», после того как Android Vitals выявил чрезмерно высокий процент частичной блокировки пробуждения приложения — 15%, что превысило рекомендуемый порог в 5%.

Команда разработчиков восприняла показатель жизненно важных параметров Android как явный сигнал о том, что фоновые процессы дольше, чем необходимо, удерживают процессор в активном состоянии. Решение этой проблемы позволило бы им и дальше обеспечивать превосходный пользовательский опыт, одновременно сокращая потери времени в фоновом режиме и поддерживая надежное и своевременное соединение и синхронизацию по Bluetooth.
Выявление проблемы
Чтобы понять, с чего начать, команда сначала обратилась к Android Vitals за дополнительной информацией о том, какие блокировки пробуждения влияют на этот показатель. Обратившись к панели мониторинга Android Vitals по чрезмерным частичным блокировкам пробуждения , они смогли определить, что наибольший вклад в это вносит один из их рабочих процессов WorkManager (обозначенный на панели как androidx.work.impl.background.systemjob.SystemJobService ). Для обеспечения «постоянной работы» WHOOP приложение использует WorkManager для фоновых задач, таких как периодическая синхронизация и доставка регулярных обновлений на носимое устройство.
Хотя команда знала , что WorkManager получает блокировку пробуждения во время выполнения задач в фоновом режиме, ранее у них не было информации о том, как распределяется вся фоновая работа (помимо WorkManager), пока в Android Vitals не был введен показатель чрезмерного количества частичных блокировок пробуждения.
Благодаря тому, что на панели управления WorkManager был определен как основной виновник проблемы, команда смогла сосредоточить свои усилия на выявлении того, кто из сотрудников вносит наибольший вклад, и работать над решением проблемы.
Использование внутренних показателей и данных для более точного определения причины проблемы.
У WHOOP уже была настроена внутренняя инфраструктура для мониторинга метрик WorkManager. Они периодически отслеживают:
- Среднее время выполнения: Как долго работает рабочий процесс?
- Превышение времени ожидания: Как часто работник превышает время ожидания вместо завершения работы?
- Повторные попытки: Как часто работник повторяет попытку, если выполнение задания завершилось по истечении времени ожидания или завершилось с ошибкой?
- Отмены: Как часто работы отменялись?
Отслеживание не только успехов и неудач сотрудников, но и многое другое позволяет команде оценить эффективность своей работы.
Внутренние показатели выявили высокое среднее время выполнения кода у нескольких отдельных сотрудников, что позволило еще больше сузить круг расследования.
В дополнение к внутренним метрикам, команда также использовала инспектор фоновых задач Android Studio для проверки и отладки интересующих процессов, уделяя особое внимание связанным блокировкам пробуждения, чтобы привести их в соответствие с метрикой, отмеченной в Android Vitals.
Исследование: Различение вариантов рабочих особей
WHOOP использует как разовое , так и периодическое планирование для некоторых задач. Это позволяет приложению повторно использовать одну и ту же логику для идентичных задач с одинаковыми критериями успеха, отличающимися только временем выполнения.
Использование внутренних метрик позволило сузить область поиска до конкретного работника, но они не могли определить, возникала ли ошибка, когда работник выполнял задачу однократно, периодически или и то, и другое. Поэтому они выпустили обновление, использующее метод setTraceTag объекта WorkManager для различения однократных и периодических вариантов одного и того же работника.
Эта дополнительная информация позволила бы им однозначно определить, какой вариант Worker (периодический или разовый) в наибольшей степени способствовал возникновению чрезмерного количества частичных блокировок пробуждения. Однако команда была удивлена, когда данные показали, что ни один из вариантов, по-видимому, не вносил большего вклада, чем другой.
Манмит Тутеджа, Android-инженер II уровня в WHOOP, сказал: «Это разделение также помогло нам подтвердить, что проблема возникает в обоих вариантах, что указывало не на конфигурацию планирования, а на проблему общей бизнес-логики внутри реализации обработчика».

Более глубокий анализ поведения работников и устранение первопричины.
Понимая необходимость анализа логики действий сотрудников , команда повторно изучила поведение работников, отмеченное в ходе расследования. В частности, они искали случаи, когда работа могла застревать и не завершаться.
Всё это в конечном итоге привело к обнаружению первопричины чрезмерного количества блокировок при пробуждении:
CoroutineWorker, предназначенный для ожидания подключения к датчику WHOOP перед продолжением работы.
Если работа начиналась без подключенного датчика, whoopSensorFlow — показатель, указывающий на наличие подключения датчика — был null . SensorWorker не рассматривал это как условие досрочного завершения и продолжал работу, фактически ожидая подключения бесконечно. В результате WorkManager удерживал частичную блокировку пробуждения до истечения времени выполнения работы, что приводило к высокому уровню использования фоновой блокировки пробуждения и частому, нежелательному перепланированию SensorWorker .
Для решения этой проблемы команда WHOOP обновила логику обработчика, добавив проверку статуса соединения перед попыткой выполнения основной бизнес-логики.
Если датчик недоступен, рабочий процесс завершается, избегая сценария тайм-аута и снимая блокировку пробуждения. Следующий фрагмент кода демонстрирует решение:
class SensorWorker(appContext: Context, params: WorkerParameters): CoroutineWorker(appContext, params) {
override suspend fun doWork(): Result {
...
// Check the sensor state and perform work or return failure
return whoopSensorFlow.replayCache
.firstOrNull()
?.let { cachedData ->
processSensorData(cachedData)
Result.success()
} ?: run {
Result.failure()
}
}
Достигнуто 90%-ное снижение количества сеансов с чрезмерной частичной блокировкой пробуждения.
После внедрения исправления команда продолжила отслеживать показатели Android Vitals, чтобы подтвердить влияние изменений.
В итоге, за 30 дней компания WHOOP добилась снижения процента случаев чрезмерного частичного пробуждения из-за блокировки сети с 15% до менее чем 1%. после внесения изменений в их систему управления работниками.

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

Начать
Если вас интересует снижение количества чрезмерных частичных блокировок пробуждения в вашем приложении или повышение эффективности работы обработчиков событий, просмотрите метрику «чрезмерные частичные блокировки пробуждения» в Android Vitals и ознакомьтесь с документацией по блокировкам пробуждения для получения дополнительной информации о передовых методах и стратегиях отладки.
Продолжить чтение

Примеры из практики
Monzo — это британский цифровой банк с 15 миллионами клиентов, и их число продолжает расти. По мере масштабирования приложения команда разработчиков определила время запуска приложения как критическую область для улучшения, но опасалась, что это потребует значительных изменений в коде.
Ben Weiss • 2 мин чтения

Примеры из практики
TikTok — это глобальная платформа для коротких видеороликов, известная своей огромной пользовательской базой и инновационными функциями.
Ben Trengrove , Ajesh Pai • 2 мин чтения

Примеры из практики
В динамичном мире социальных сетей внимание пользователей быстро завоевывается или теряется. Мета-приложения (Facebook и Instagram) входят в число крупнейших социальных платформ мира и обслуживают миллиарды пользователей по всему миру.
Mayuri Khinvasara Khabya • Чтение на 4 минуты
Будьте в курсе событий
Получайте еженедельно самые свежие новости о разработке Android прямо на свою электронную почту.





