여러 라이브러리와 시스템 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*
:AlarmManager
에 의해 생성됩니다.AudioIn
,AudioMix
: Media API에서 만듭니다.GOOGLE_C2DM
: 앱에 Firebase 클라우드 메시지 (FCM) 브로드캐스트를 전송하는 동안 획득됩니다.*job*/<package_name>/<package_and_job_name>
: JobScheduler 작업에서 생성합니다.*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
: WorkManager 작업자가 만듭니다.NetworkLocationLocator
,FusedLocation
,*location*
: 위치 API에서 생성합니다._UNKNOWN
: wake lock 이름이 개인 식별 정보 (PII)를 사용하는 것처럼 보이면 디버깅 도구에 표시됩니다.
*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 이름은 LocationManager
및 FusedLocationProviderClient
에서 기기 위치를 획득하고 전송하는 데 사용됩니다. 이러한 API를 호출한 앱에 wake lock이 기여합니다.
권장사항
위치 사용 최적화 예를 들어 제한 시간을 설정하거나, 위치 요청을 일괄 처리하거나, 수동 위치 업데이트를 사용합니다.
_UNKNOWN
디버깅 도구에서 wake lock 이름에 개인 식별 정보 (PII)가 포함되어 있다고 생각하면 실제 wake lock 이름이 표시되지 않습니다. 대신 웨이크 락을 _UNKNOWN
로 라벨링합니다. 예를 들어 도구는 절전 모드 잠금 이름에 이메일 주소가 포함된 경우 이를 실행할 수 있습니다.
권장사항
wake lock 이름 지정 권장사항을 따르고 wake lock 이름에 PII를 사용하지 마세요. 앱에 기여한 _UNKNOWN
라는 이름의 wake lock을 발견하면 어떤 wake lock인지 파악하고 다른 이름을 지정하세요.