제품 소식

Android vitals wake lock 측정항목을 사용하여 앱 배터리 최적화

전문 길이: 7분
Alice Yuan
개발자 관계팀 엔지니어

배터리 수명은 사용자 환경의 중요한 측면이며 절전 모드는 중요한 역할을 합니다. 과도하게 사용하고 있나요? 이 블로그 게시물에서는 절전 모드 해제 잠금이란 무엇인지, 절전 모드 해제 잠금 사용에 관한 권장사항은 무엇인지, Play Console 측정항목을 사용하여 자체 앱의 동작을 더 잘 이해하는 방법을 살펴봅니다.

Android vitals의 과도한 부분적인 wake lock 사용

이제 Play Console에서 과도한 부분적인 wake lock 사용을 핵심 성과 지표로 삼아 배터리 소모를 모니터링합니다.

이 기능은 과도한 사용자 인지 비정상 종료 및 ANR이라는 기존 핵심 측정항목 안정성 지표와 함께 배터리 효율성의 중요성을 높입니다. 과도한 wake lock에 대한 비정상적인 동작 기준을 정의했습니다. 2026년 3월 1일부터 타이틀이 이 품질 기준을 충족하지 않으면 추천과 같은 눈에 띄는 탐색 표시 경로에서 타이틀이 제외될 수 있습니다. 경우에 따라 스토어 등록정보에 경고가 표시되어 앱이 배터리 소모를 과도하게 유발할 수 있음을 사용자에게 알릴 수 있습니다.

warning.png

Android vitals 개요의 과도한 wake lock 경고

모바일 기기의 경우 Android 핵심 지표는 화면이 꺼져 있고 앱이 백그라운드에 있거나 포그라운드 서비스를 실행하는 동안 획득한 예외가 아닌 wake lock에 적용됩니다. 다음과 같은 경우 Android vitals는 부분적인 wake lock 사용이 과도하다고 간주합니다.

  • 절전 모드 해제는 24시간 동안 최소 2시간 동안 유지됩니다.
  • 28일 동안의 평균이 앱 세션의 5% 를 초과합니다.

오디오위치, JobScheduler 사용자 시작 API에 의해 생성된 wake lock은 wake lock 계산에서 제외됩니다.

wake lock 이해

wake lock은 사용자가 기기와 적극적으로 상호작용하지 않을 때도 앱이 기기의 CPU를 계속 실행할 수 있도록 하는 메커니즘입니다. 

부분적인 wake lock은 화면이 꺼져 있어도 CPU를 계속 실행하여 CPU가 저전력 '정지' 상태로 전환되지 않도록 합니다. 전체 wake lock은 화면과 CPU를 모두 실행 상태로 유지합니다.

부분 절전 모드 해제 잠금을 획득하는 방법에는 두 가지가 있습니다.

  • 앱은 특정 사용 사례를 위해 PowerManager API를 사용하여 절전 모드 해제 잠금을 수동으로 획득하고 해제합니다. 이는 사용자에게 감지되는 작업을 위해 설계된 플랫폼 수명 주기 API인 포그라운드 서비스와 함께 획득되는 경우가 많습니다.
  • 또는 다른 API에서 절전 모드 해제 잠금을 획득하고 API 사용으로 인해 앱에 기여도가 부여됩니다. 자세한 내용은 권장사항 섹션을 참고하세요.

wake lock은 사용자가 시작한 대용량 파일 다운로드를 완료하는 등의 작업에 필요하지만 과도하거나 부적절하게 사용하면 배터리가 크게 소모될 수 있습니다. 앱이 몇 시간 동안 절전 모드 해제 잠금을 유지하거나 제대로 해제하지 않아 사용자가 앱과 상호작용하지 않을 때도 배터리 소모가 심하다는 불만을 제기하는 사례가 있었습니다.

절전 모드 해제 잠금 사용 권장사항

절전 모드 해제 잠금의 과도한 사용을 디버그하는 방법을 살펴보기 전에 절전 모드 해제 잠금 권장사항을 따르고 있는지 확인하세요. 

다음 네 가지 중요한 질문을 고려해 보세요.


1. 대체 절전 모드 해제 옵션을 고려해 보셨나요?

수동 부분 절전 모드 해제 획득을 고려하기 전에 다음 의사결정 흐름도를 따르세요.

wakelock.png

절전 모드 해제 잠금을 수동으로 획득할 시기를 결정하는 플로차트

  1. 화면을 켜진 상태로 유지해야 하나요?
  2. 애플리케이션이 포그라운드 서비스를 실행하고 있나요?
    • 아니요. 절전 모드 해제 잠금을 수동으로 획득할 필요가 없습니다.
  3. 기기가 일시 중지되면 사용자 환경에 해로운가요?
    • 아니요. 예를 들어 기기가 절전 모드에서 해제된 후 알림을 업데이트하는 데는 절전 모드 해제 잠금이 필요하지 않습니다.
    • 예: 외부 기기와의 지속적인 통신과 같이 기기가 정지되지 않도록 하는 것이 중요한 경우 계속 진행합니다.
  4. 기기를 대신 절전 모드로 전환하지 않는 API가 이미 있나요?
  5. 이러한 질문에 모두 답변하고 대체 방법이 없다고 판단한 경우 절전 모드 해제 잠금을 수동으로 획득해야 합니다.

2. 절전 모드 해제 잠금의 이름을 올바르게 지정하고 있나요?

절전 모드 해제 잠금을 수동으로 획득할 때는 디버깅을 위해 적절한 이름이 중요합니다.

  • 이름에서 이메일 주소와 같은 개인 식별 정보 (PII)를 제외하세요. PII가 감지되면 절전 모드 해제 잠금이 _UNKNOWN로 로깅되어 디버깅이 방해됩니다.
  • 클래스 또는 메서드 이름을 사용하여 절전 모드 해제 잠금을 프로그래매틱 방식으로 지정하지 마세요. Proguard와 같은 도구로 난독화될 수 있기 때문입니다. 대신 하드 코딩된 문자열을 사용하세요.
  • wake lock 태그에 카운터 또는 고유 식별자를 추가하지 마세요. 절전 모드가 실행될 때마다 동일한 태그를 사용하여 시스템이 이름별로 사용량을 집계할 수 있도록 해야 비정상적인 동작을 더 쉽게 감지할 수 있습니다.

3. 획득한 절전 모드 해제 잠금이 항상 해제되나요?

wake lock을 수동으로 획득하는 경우 wake lock 출시가 항상 실행되는지 확인하세요. 절전 모드 해제를 해제하지 않으면 배터리가 크게 소모될 수 있습니다. 

예를 들어 processingWork() 중에 포착되지 않은 예외가 발생하면 release() 호출이 발생하지 않을 수 있습니다. 대신 try-finally 블록을 사용하여 예외가 발생하더라도 wake lock이 해제되도록 보장할 수 있습니다.

또한 특정 기간이 지나면 절전 모드가 해제되도록 절전 모드에 타임아웃을 추가하여 절전 모드가 무기한으로 유지되지 않도록 할 수 있습니다.

  fun processingWork() {
    wakeLock.apply {
        try {
            acquire(60 * 10 * 1000) // timeout after 10 minutes
            doTheWork()
        } finally {
            release()
        }
    }
}

4. 절전 모드 해제 빈도를 줄일 수 있나요?

주기적인 데이터 요청의 경우 앱이 기기를 절전 모드에서 해제하는 빈도를 줄이는 것이 배터리 최적화의 핵심입니다. 절전 모드 해제 빈도를 줄이는 방법의 예는 다음과 같습니다.

  • WorkManager: PeriodicWorkRequest에서 주기적 간격을 늘립니다.
  • SensorManager: 리스너를 등록할 때 maxReportLatencyMs를 지정하여 일괄 처리를 활용합니다.
  • 통합 위치 정보 제공자:
    • 가장 최근에 캐시된 위치에 getLastLocation을 사용하여 위치 검색 빈도를 줄입니다.
    • 배터리 소모가 적은 업데이트 방법에는 setPriority(PRIORITY_PASSIVE)를 사용합니다.
    • 또한 setMinUpdateIntervalMillis를 사용하여 최소 업데이트 간격을 설정하여 위치 일괄 처리 메커니즘을 활용할 수 있습니다.

자세한 내용은 절전 모드 해제 잠금 권장사항 문서를 참고하세요.

불필요한 wake lock 사용 디버깅

최선의 의도에도 불구하고 과도한 절전 모드 해제 잠금 사용이 발생할 수 있습니다. Play Console에서 앱에 플래그가 지정된 경우 디버그하는 방법은 다음과 같습니다.

Play Console을 통한 초기 식별

Android vitals 과도한 부분 wake lock 대시보드에는 앱과 연결된 예외가 아닌 wake lock 이름의 분석이 표시되며, 영향을 받는 세션과 기간이 표시됩니다. 문서를 사용하여 절전 모드 해제 잠금 이름이 앱에 의해 유지되는지 아니면 다른 API에 의해 유지되는지 식별하라는 알림

breakdowns2.png

Android vitals의 과도한 부분적 장기간 wake lock 대시보드가 과도한 장기간 wake lock 태그를 보기 위해 분석 섹션까지 아래로 스크롤되었습니다.

작업자/작업에서 보유한 과도한 절전 모드 해제 디버깅

다음 절전 모드 해제 잠금 이름으로 작업자 보유 절전 모드 해제 잠금을 식별할 수 있습니다.

*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService

작업자 보유 절전 모드 해제 이름의 전체 변형 목록은 문서에서 확인할 수 있습니다. 이러한 절전 모드를 디버그하려면 Background Task Inspector를 사용하여 로컬로 디버그하거나 getStopReason을 활용하여 필드에서 문제를 디버그하면 됩니다. 

Android 스튜디오 백그라운드 작업 검사기

taskinspector.png


자주 재시도하고 실패한 작업자 'WeatherSyncWorker'를 식별할 수 있었던 Background Task Inspector의 화면 캡처

WorkManager 문제의 로컬 디버깅에는 에뮬레이터나 연결된 기기 (API 수준 26 이상)에서 이 도구를 사용하세요. 작업자 목록과 상태 (완료, 실행 중, 대기열에 추가됨)가 표시되므로 세부정보를 검사하고 작업자 체인을 이해할 수 있습니다. 

예를 들어 시스템 제한에 도달하여 작업자가 자주 실패하거나 재시도하는지 확인할 수 있습니다. 

자세한 내용은 Background Task Inspector 문서를 참고하세요.

WorkManager getStopReason

과도한 절전 모드 해제 잠금이 있는 작업자의 현장 디버깅에는 WorkManager 2.9.0 이상에서 WorkInfo.getStopReason()를 사용하거나 JobScheduler의 경우 SDK 31 이상에서 제공되는 JobParameters.getStopReason()를 사용하세요. 

이 API는 작업자가 중지된 이유 (예: STOP_REASON_TIMEOUTSTOP_REASON_QUOTA)를 기록하여 런타임 기간 소진으로 인한 빈번한 타임아웃과 같은 문제를 정확히 파악하는 데 도움이 됩니다.

  backgroundScope.launch {
    WorkManager.getInstance(context)
        .getWorkInfoByIdFlow(workRequest.id)
        .collect { workInfo ->
            logStopReason(workRequest.id, workInfo?.stopReason)
        }
}

자세한 내용은 작업 예약 API의 배터리 사용량 최적화를 참고하세요.

다른 유형의 과도한 절전 모드 해제 디버깅

절전 모드를 수동으로 유지하거나 절전 모드를 유지하는 API가 포함된 더 복잡한 시나리오의 경우 시스템 트레이스 수집을 사용하여 디버그하는 것이 좋습니다.

시스템 트레이스 수집

시스템 트레이스 는 일정 기간 동안의 시스템 활동에 관한 세부 기록을 캡처하는 강력한 디버깅 도구로, CPU 상태, 스레드 활동, 네트워크 활동, 작업 기간 및 절전 모드 해제 사용과 같은 배터리 관련 측정항목에 관한 유용한 정보를 제공합니다.

다음과 같은 여러 방법으로 시스템 트레이스를 캡처할 수 있습니다. 

powermgmt.png

Android 앱 및 서비스 탭의 Perfetto UI에서 'power:PowerManagement' Atrace 카테고리를 사용 설정합니다. 

선택한 방법과 관계없이 기기 상태 트랙을 볼 수 있도록 'power:PowerManagement' Atrace 카테고리를 수집해야 합니다. 

Perfetto UI 검사 및 SQL 분석

시스템 트레이스는 Perfetto UI에서 열고 검사할 수 있습니다. 트레이스를 열면 타임라인에 다양한 프로세스가 시각화되어 표시됩니다. 이 가이드에서는 '기기 상태'에 있는 트랙에 중점을 둡니다.

perfetto.png


'상위 앱', '화면 상태', '긴 절전 모드 잠금', '작업' 트랙과 같은 '기기 상태' 아래의 트랙을 고정하여 장기 실행 절전 모드 잠금 슬라이스를 시각적으로 식별합니다.

각 블록에는 이벤트 이름, 이벤트 시작 시간, 이벤트 종료 시간이 표시됩니다. Perfetto에서는 이를 슬라이스라고 합니다.

여러 트레이스를 확장 가능하게 분석하려면 Perfetto의 SQL 분석을 사용하면 됩니다. SQL 쿼리는 기간별로 정렬된 모든 절전 모드 해제 잠금을 찾아 과도한 사용량에 가장 큰 영향을 미치는 요인을 식별하는 데 도움이 됩니다.

다음은 시스템 트레이스에서 발생한 모든 절전 모드 해제 태그를 합산하고 총 기간별로 정렬하는 쿼리의 예입니다.

  SELECT slice.name as name, track.name as track_name,SUM(dur / 100000) as total_dur_ms
FROM slice
JOIN track ON slice.track_id = track.id
WHERE track.name = 'WakeLocks'GROUP BY slice.name, track.name
ORDER BY total_dur_ms DESC

ProfilingManager를 사용하여 현장 추적 수집

재현하기 어려운 문제의 경우 ProfilingManager (SDK 35에 추가됨)는 개발자가 시작 및 종료 트리거를 사용하여 필드에서 시스템 트레이스를 수집할 수 있는 프로그래매틱 API입니다. 프로필 수집의 시작 및 종료 트리거 포인트를 더 세밀하게 제어할 수 있으며 기기 성능에 영향을 미치지 않도록 시스템 수준 비율 제한을 적용합니다. 

필드 시스템 트레이스 수집을 구현하는 방법에 관한 자세한 단계는 ProfilingManager 문서를 참고하세요. 여기에는 프로그래매틱 방식으로 트레이스를 캡처하고, 프로파일링 데이터를 분석하고, 로컬 디버그 명령어를 사용하는 방법이 포함되어 있습니다.

ProfilingManager를 사용하여 수집된 시스템 트레이스는 수동으로 수집된 트레이스와 비슷하지만 시스템 프로세스와 기타 앱 프로세스는 트레이스에서 수정됩니다.

결론

Android vitals의 과도한 부분적인 wake lock 측정항목은 배터리 소모를 줄이고 앱 품질을 개선하는 데 개발자를 지원하기 위한 Google의 지속적인 노력의 일부분일 뿐입니다. 

wake lock을 이해하고 올바르게 구현하면 앱의 배터리 성능을 크게 최적화할 수 있습니다. 대체 API를 활용하고, wake lock 권장사항을 준수하고, 백그라운드 작업 검사기, 시스템 트레이스, ProfilingManager와 같은 강력한 디버깅 도구를 사용하는 것이 Google Play에서 앱의 성공을 보장하는 데 중요합니다.

작성자:

계속 읽기