Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

불필요한 wakeup

wakeup은 개발자가 지정된 시간에 기기의 절전 모드를 해제하도록 알람을 설정할 수 있는 AlarmManager API의 메커니즘입니다. 앱은 AlarmManagerset() 메서드 중 하나를 RTC_WAKEUP 또는 ELAPSED_REALTIME_WAKEUP 플래그와 함께 호출하여 wakeup 알람을 설정합니다. wakeup 알람이 트리거되면 기기는 저전력 모드에서 나와 알람의 onReceive() 또는 onAlarm() 메서드를 실행하는 동안 부분 wake lock 상태를 유지합니다. wakeup 알람이 불필요하게 트리거되면 기기의 배터리가 소모될 수 있습니다.

앱 품질을 개선하기 위해 Android에서는 앱에 불필요한 wakeup 알람이 발생하는지 자동으로 모니터링하고 Android vitals에 정보를 표시합니다. 데이터가 수집되는 방법에 관한 자세한 내용은 Play Console 문서를 참조하세요.

앱에서 불필요하게 기기의 절전 모드를 해제하는 경우 이 페이지의 안내를 사용하여 문제를 진단하고 해결할 수 있습니다.

문제 해결

AlarmManager는 초기 버전의 Android 플랫폼에 도입되었지만, 시간이 지나면서 이전에는 AlarmManager가 필요했던 많은 사용 사례를 이제 WorkManager와 같은 새로운 기능을 통해 더 효율적으로 지원할 수 있습니다. 이 섹션에는 wakeup 알람을 줄이기 위한 도움말이 포함되어 있지만, 장기적으로 권장사항 섹션에 있는 권장사항을 따르도록 앱을 이전하는 것이 좋습니다.

wakeup 알람을 예약한 앱의 위치를 식별하고 해당하는 알람이 트리거되는 빈도를 줄이세요. 다음은 몇 가지 팁입니다.

  • RTC_WAKEUP 또는 ELAPSED_REALTIME_WAKEUP 플래그 중 하나를 포함하는 AlarmManager의 다양한 set() 메서드 호출을 찾습니다.

  • 알람이 설정된 소스의 위치를 쉽게 식별할 수 있도록 패키지, 클래스 또는 메서드 이름을 알람의 태그 이름에 포함하는 것이 좋습니다. 다음은 몇 가지 추가적인 도움말입니다.

    • 이름에서 이메일 주소와 같은 개인 식별 정보(PII)를 제외하세요. 그러지 않으면 기기가 알람 이름 대신 _UNKNOWN 을 로깅합니다.
    • Proguard로 난독화되었을 수 있으므로 프로그래매틱 방식(예: getName() 호출)으로 클래스 또는 메서드 이름을 가져오면 안 됩니다. 대신 하드 코딩된 문자열을 사용하세요.
    • 알람 태그에 카운터 또는 고유 식별자를 추가하지 마세요. 알람 모두에는 고유 식별자가 있으므로 시스템에서 이러한 방식으로 설정된 알람을 집계할 수 없습니다.

문제를 해결한 후 다음 adb 명령어를 실행하여 wakeup 알람이 예상대로 작동하는지 확인하세요.

adb shell dumpsys alarm
    

이 명령어는 기기의 알람 시스템 서비스 상태에 관한 정보를 제공합니다. 자세한 내용은 dumpsys를 참조하세요.

권장사항

앱에서 알림을 게시하거나 사용자에게 알림을 보내는 등 사용자에게 표시되는 작업을 실행해야 하는 경우에만 wakeup 알람을 사용하세요. AlarmManager 권장사항 목록은 반복 알람 예약을 참조하세요.

AlarmManager를 사용하여 백그라운드 작업, 특히 반복되거나 네트워크 백그라운드에서 실행되는 작업을 예약하면 안 됩니다. 다음과 같은 이점이 있으므로 백그라운드 작업을 예약하려면 WorkManager를 사용하세요.

  • 일괄 처리 - 작업이 결합되므로 배터리 소모가 줄어듭니다.
  • 지속성 - 기기가 재부팅되는 경우 재부팅이 완료된 후 예약된 WorkManager 작업이 실행됩니다.
  • 기준 - 기기가 충전 중이거나 Wi-Fi가 사용 가능한지 여부와 같은 조건에 따라 작업을 실행할 수 있습니다.

자세한 내용은 백그라운드 처리 가이드를 참조하세요.

AlarmManager를 사용하여 앱이 실행되는 동안에만 유효한 타이밍 작업을 예약하면 안 됩니다(즉, 타이밍 작업은 사용자가 앱을 종료할 때 취소되어야 함). 이러한 상황에서는 더 사용하기 쉽고 훨씬 효율적인 Handler 클래스를 사용하세요.