웨어러블용 Android 앱을 빌드할 때는 화면이 꺼진 후부터 본격적인 작업이 시작됩니다. WHOOP은 회원이 자신의 신체가 운동, 회복, 수면, 스트레스에 어떻게 반응하는지 이해하도록 돕습니다. Android를 사용하는 많은 WHOOP 회원에게는 안정적인 백그라운드 동기화와 연결이 이러한 인사이트를 얻는 데 필수적입니다.
올해 초 Google Play는 Android vitals에 새로운 측정항목인 과도한 부분 wake lock을 출시했습니다. 이 측정항목은 24시간 동안 누적된 비면제 wake lock 사용량이 2시간을 초과하는 사용자 세션의 비율을 측정합니다. 이 측정항목의 목적은 배터리 소모의 원인을 파악하고 해결하는 데 도움을 주는 것입니다. 이는 우수한 사용자 환경을 제공하는 데 매우 중요합니다.
2026년 3월 1일부터 품질 기준을 충족하지 않는 앱은 Google Play 탐색 표시 경로에서 제외될 수 있습니다. 또한 Google Play 스토어 등록정보에 앱이 예상보다 많은 배터리를 사용할 수 있다는 경고가 표시될 수 있습니다.
WHOOP의 선임 Android 엔지니어인 마얀크 사이니에 따르면, Android vitals에서 앱의 과도한 부분적인 wake lock 비율이 권장 기준인 5%를 초과하는 15%로 표시된 후 '팀이 Android 효율성을 높일 기회를 얻게 되었습니다.'
팀은 Android vitals 측정항목을 통해 백그라운드 작업이 필요 이상으로 CPU를 오래 깨어 있게 한다는 명확한 신호를 확인했습니다. 이 문제를 해결하면 우수한 사용자 환경을 계속 제공하는 동시에 백그라운드 시간 낭비를 줄이고 안정적이고 시기적절한 블루투스 연결 및 동기화를 유지할 수 있습니다.
문제 파악
어디서부터 시작해야 할지 파악하기 위해 팀은 먼저 Android vitals를 통해 어떤 wake lock이 측정항목에 영향을 미치는지 자세히 알아봤습니다. Android vitals 과도한 부분 화면 wake lock 대시보드를 참고하여 과도한 부분 화면 wake lock의 가장 큰 원인이 WorkManager 작업자 중 하나 (대시보드에서 androidx.work.impl.background.systemjob.SystemJobService로 식별됨)임을 파악할 수 있었습니다. WHOOP의 '상시 사용 설정 환경'을 지원하기 위해 앱은 주기적인 동기화 및 웨어러블에 반복적인 업데이트 전송과 같은 백그라운드 작업에 WorkManager를 사용합니다.
팀은 WorkManager가 백그라운드에서 작업을 실행하는 동안 wake lock을 획득한다는 사실을 알고 있었지만, Android vitals에 과도한 부분 wake lock 측정항목이 도입되기 전에는 WorkManager뿐만 아니라 모든 백그라운드 작업이 어떻게 분산되는지 파악하지 못했습니다.
대시보드에서 WorkManager가 주요 원인으로 식별되자 팀은 가장 큰 영향을 미치는 작업자가 누구인지 파악하고 문제를 해결하는 데 집중할 수 있었습니다.
내부 측정항목 및 데이터를 활용하여 원인을 더 정확하게 파악
WHOOP에는 WorkManager 측정항목을 모니터링하기 위한 내부 인프라가 이미 설정되어 있었습니다. 다음 항목을 주기적으로 모니터링합니다.
- 평균 런타임: 작업자가 실행되는 시간입니다.
- 시간 초과: 작업자가 완료되지 않고 시간 초과되는 빈도는 얼마나 되나요?
- 재시도: 작업 시간이 초과되거나 실패한 경우 작업자가 얼마나 자주 재시도하나요?
- 취소: 작업이 얼마나 자주 취소되었나요?
작업자의 성공과 실패뿐만 아니라 다양한 요소를 추적하면 팀에서 작업의 효율성을 파악할 수 있습니다.
내부 측정항목에서 일부 작업자의 평균 런타임이 높음으로 표시되어 조사를 더욱 좁힐 수 있었습니다.
팀은 내부 측정항목 외에도 Android 스튜디오의 Background Task Inspector를 사용하여 관심 있는 작업자를 검사하고 디버그했습니다. 특히 관련 wake lock에 중점을 두어 Android vitals에서 신고된 측정항목과 일치시켰습니다.
조사: 작업자 변이 구분
WHOOP는 일부 작업자에 대해 일회성 및 정기 예약을 모두 사용합니다. 이렇게 하면 앱에서 동일한 성공 기준을 가진 동일한 작업에 대해 동일한 Worker 로직을 재사용할 수 있으며, 타이밍만 다릅니다.
내부 측정항목을 사용하여 특정 작업자로 검색 범위를 좁힐 수 있었지만 작업자가 일회성인지, 주기적인지, 아니면 둘 다인지에 따라 버그가 발생했는지 알 수 없었습니다. 따라서 WorkManager의 setTraceTag 메서드를 사용하여 동일한 Worker의 일회성 변형과 주기적 변형을 구분하는 업데이트를 출시했습니다.
이 추가 세부정보를 통해 과도한 부분 wakeup lock이 있는 세션에 가장 많이 기여하는 Worker 변형 (주기적 또는 일회성)을 명확하게 식별할 수 있습니다. 하지만 데이터에 따르면 두 변형 모두 다른 변형보다 더 많은 기여를 하지 않는 것으로 나타나 팀은 놀랐습니다.
WHOOP의 Android 엔지니어 II인 만미트 투테자는 "이 분할은 두 변형 모두에서 문제가 발생하고 있음을 확인하는 데도 도움이 되었으며, 이는 예약 구성이 아닌 작업자 구현 내부의 공유 비즈니스 로직 문제를 가리켰습니다."라고 말했습니다.
작업자 동작을 자세히 살펴보고 근본 원인 해결하기
작업자 내의 로직을 살펴봐야 한다는 사실을 알게 된 팀은 조사 중에 신고된 작업자의 작업자 동작을 다시 검토했습니다. 특히 작업이 중단되고 완료되지 않는 인스턴스를 찾고 있었습니다.
이 모든 과정은 과도한 wake lock의 근본 원인을 찾는 것으로 이어졌습니다.
WHOOP 센서에 연결될 때까지 기다린 후 진행하도록 설계된 CoroutineWorker
센서가 연결되지 않은 상태에서 작업이 시작된 경우 센서가 연결되었는지 여부를 나타내는 whoopSensorFlow가 null였습니다. SensorWorker에서 이를 조기 종료 조건으로 처리하지 않고 계속 실행하여 연결을 무기한 기다렸습니다. 그 결과 WorkManager는 작업이 타임아웃될 때까지 부분 wake lock을 유지하여 백그라운드 wake lock 사용량이 많아지고 원치 않는 SensorWorker의 재예약이 빈번하게 발생했습니다.
이 문제를 해결하기 위해 WHOOP팀은 핵심 비즈니스 로직을 실행하기 전에 연결 상태를 확인하도록 작업자 로직을 업데이트했습니다.
센서를 사용할 수 없는 경우 작업자가 종료되어 제한 시간 시나리오를 방지하고 wake lock을 해제합니다. 다음 코드 스니펫은 솔루션을 보여줍니다.
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()
}
}과도한 부분 wake lock이 있는 세션 90% 감소
수정사항을 적용한 후에도 팀은 Android vitals 대시보드를 계속 모니터링하여 변경사항의 영향을 확인했습니다.
결과적으로 WHOOP는 Worker를 변경한 지 30일 만에 과도한 부분 wake lock 비율이 15% 에서 1%미만으로 감소했습니다.
이러한 변화로 인해 작업이 완료되지 않고 타임아웃되는 경우가 줄어들어 평균 런타임이 감소했습니다.
백그라운드 작업의 효율성을 개선하려는 다른 개발자에게 WHOOP팀이 전하는 조언은 다음과 같습니다.
시작하기
앱의 과도한 부분 wake lock을 줄이거나 작업자 효율성을 개선하고 싶다면 Android vitals에서 앱의 과도한 부분 wake lock 측정항목을 확인하고 wake lock 문서에서 권장사항과 디버깅 전략을 검토하세요.
-
우수사례Grab은 동남아시아의 선도적인 슈퍼 앱으로, 하나의 앱을 통해 8개 국가의 수백만 명의 사용자에게 배달, 모빌리티, 금융 서비스를 제공합니다.
Ajesh Pai, Nguyen Van Minh, Tracy Agyemang • 읽는 데 5분 소요 -
우수사례WhatsApp은 전 세계 수십억 명의 사용자에게 서비스를 제공하는 세계 최대 규모의 메시지 플랫폼입니다. WhatsApp은 다양한 지역의 사용자가 비공개적이고 안정적이며 안전한 메시지를 통해 소통할 수 있는 기본 커뮤니케이션 도구입니다.
Niharika Arora, Tracy Agyemang, Mayank Jain • 읽는 데 8분 소요 -
우수사례Tinder는 새로운 세대의 싱글들이 쉽고 재미있게 만나고 진정한 관계를 맺을 수 있도록 지원하고 영감을 주는 것을 목표로 합니다.
Ajesh Pai, Ulises Uriel Verduzco Díaz , Tracy Agyemang • 읽는 데 4분 소요
Android 개발 관련 최신 정보를 이메일로 받아 보세요.