다른 API에서 만든 wake lock 식별

여러 라이브러리와 시스템 API가 앱에 기인하는 wake lock을 획득할 수 있습니다. 이로 인해 문제를 일으킬 수 있는 앱의 wake lock을 식별하기 어려울 수 있습니다. API를 오용하면 wake lock API를 직접 호출하지 않더라도 앱이 wake lock을 너무 오래 보유하게 될 수 있습니다.

이 문서에는 wake lock 디버깅 도구를 사용할 때 표시될 수 있는 일반적인 wake lock 이름이 나열되어 있습니다. Android vitals의 보고서에도 이러한 이름이 표시될 수 있습니다. 경우에 따라 라이브러리 또는 시스템 API에서 wake lock을 만들었을 수 있습니다. 다른 경우에는 도구가 앱에서 사용하는 wake lock 이름을 난독화하는 이유가 있습니다. 디버깅 도구를 사용하여 오작동하는 wake lock을 식별한 다음 이 문서에서 wake lock 이름을 찾아 문제를 일으키는 API와 해결 방법을 파악할 수 있습니다.

이 문서에서는 다음과 같은 wake lock 이름을 다룹니다. 각 경우 웨이크 잠금은 다른 라이브러리 또는 API에서 만들 수 있지만 잠금은 해당 API를 호출한 앱에 기인합니다.

*alarm*

이 wake lock은 AlarmManager에 의해 획득되며 호출 앱에 기여합니다. AlarmManager는 알람이 울릴 때 wake lock을 획득하고 알람 브로드캐스트의 onReceive() 메서드 실행이 완료되면 잠금을 해제합니다.

권장사항

알람 동작을 최적화하려면 다음 권장사항을 따르세요.

  • AlarmManager를 사용하여 알람 예약 빈도를 최적화합니다.
  • 필요한 경우에만 기기를 깨우는 RTC_WAKEUP 알람을 사용합니다.
  • 알람 사용을 최소화하고 onReceive() 메서드에서 긴 작업을 하지 마세요.

AudioIn, AudioMix

이름이 Audio로 시작하는 다양한 웨이크락은 오디오를 녹음하거나 재생할 때 미디어 API에 의해 획득됩니다. 웨이크락은 호출 앱에 기인합니다.

AudioIn는 캠코더 모드에서 AudioRecord 캡처 중에 마이크가 활성화된 상태에서 획득됩니다. AudioMix는 기기에 AudioTrack 재생하는 동안 획득됩니다. 다른 Media API는 Audio으로 시작하는 다른 이름의 wake lock을 획득할 수 있습니다.

권장사항

다음 권장사항을 따르는 것이 좋습니다.

  • Audio로 시작하는 wake lock 이름은 사용하지 마세요.
  • media API를 사용하는 경우 wake lock을 직접 획득할 필요가 없습니다. API를 사용하여 필요한 wake lock을 획득할 수 있습니다.
  • media API를 사용할 때는 더 이상 필요하지 않으면 미디어 세션을 종료합니다.

GOOGLE_C2DM

이 웨이크락은 Firebase 클라우드 메시지(FCM) 브로드캐스트를 앱에 전송하는 동안 GCM에서 획득합니다. 웨이크락은 FCM 브로드캐스트 onMessageReceived() 메서드의 실행이 완료되면 해제됩니다.

권장사항

FCM 동작을 최적화하려면 다음 권장사항을 따르는 것이 좋습니다.

  • FCM 전송 빈도를 최적화합니다.
  • 메시지를 즉시 전송해야 하는 경우가 아니라면 우선순위가 높은 FCM을 사용하지 마세요.
  • onMessageReceived() 메서드가 최대한 빨리 완료되도록 합니다. 자세한 내용은 Firebase 안내를 참고하세요.

*job*/<package_name>/<package_and_job_name>

이러한 wake lock은 백그라운드에서 작업을 실행하는 동안 JobScheduler 작업에서 사용합니다. wake lock은 작업자를 만든 앱에 기인합니다.

"<package_name>"은 앱의 패키지 이름이지 리터럴 텍스트 <package name>가 아닙니다. 마찬가지로 "<package_and_job_name>"은 패키지 이름 뒤에 작업 이름이 오는 것을 나타냅니다. *job*는 별표가 포함된 문자 시퀀스 *job*입니다. 별표는 와일드 카드로 사용되지 않습니다. 다음은 이러한 wake lock 이름의 예입니다.

*job*/com.example.app/com.example.app.example.path.ExampleJobService

권장사항

JobScheduler 작업 사용을 감사합니다. 특히 작업 예약 API의 배터리 사용량 최적화에 관한 안내를 따르세요.

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

이러한 wake lock은 백그라운드에서 작업을 실행하는 동안 WorkManager 작업자가 사용합니다. wake lock은 작업자를 만든 앱에 기인합니다.

"<package_name>"은 앱의 패키지 이름이지 리터럴 텍스트 <package name>가 아닙니다. *job*는 별표가 포함된 문자 시퀀스 *job*입니다. 별표는 와일드 카드로 사용되지 않습니다.

권장사항

WorkManager 작업자 사용을 감사합니다. 특히 작업 예약 API의 배터리 사용량 최적화에 관한 안내를 따르세요.

NetworkLocationLocator, FusedLocation, *location*

이러한 wake lock 이름은 LocationManagerFusedLocationProviderClient에서 기기 위치를 획득하고 전송하는 데 사용됩니다. 이러한 API를 호출한 앱에 wake lock이 기여합니다.

권장사항

위치 사용 최적화 예를 들어 제한 시간을 설정하거나, 위치 요청을 일괄 처리하거나, 수동 위치 업데이트를 사용합니다.

_UNKNOWN

디버깅 도구에서 wake lock 이름에 개인 식별 정보 (PII)가 포함되어 있다고 생각하면 실제 wake lock 이름이 표시되지 않습니다. 대신 웨이크 락을 _UNKNOWN로 라벨링합니다. 예를 들어 도구는 절전 모드 잠금 이름에 이메일 주소가 포함된 경우 이를 실행할 수 있습니다.

권장사항

wake lock 이름 지정 권장사항을 따르고 wake lock 이름에 PII를 사용하지 마세요. 앱에 기여한 _UNKNOWN라는 이름의 wake lock을 발견하면 어떤 wake lock인지 파악하고 다른 이름을 지정하세요.