wake lock을 사용하면 기기 성능이 저하될 수 있습니다. 절전 모드 잠금을 사용해야 하는 경우 올바르게 사용해야 합니다. 이 문서에서는 일반적인 wake lock 문제를 방지하는 데 도움이 되는 몇 가지 권장사항을 설명합니다.
wake lock 이름을 올바르게 지정
wakelock 태그에 패키지, 클래스 또는 메서드 이름을 포함하는 것이 좋습니다. 이렇게 하면 오류가 발생할 경우 소스 코드에서 웨이크 락이 생성된 위치를 더 쉽게 찾을 수 있습니다. 다음은 몇 가지 추가적인 도움말입니다.
- 이름에서 이메일 주소와 같은 개인 식별 정보(PII)를 제외하세요. 기기가 wake lock 태그에서 PII를 감지하면 지정된 태그 대신
_UNKNOWN
을 로깅합니다. - Proguard로 난독화되었을 수 있으므로 프로그래매틱 방식(예:
getName()
호출)으로 클래스 또는 메서드 이름을 가져오면 안 됩니다. 프로그래매틱 방식으로 이름을 가져오려고 하면 Proguard와 같은 도구에 의해 난독화될 수 있습니다. 대신 하드 코딩된 문자열을 사용하세요. - wake lock 태그에 카운터 또는 고유 식별자를 추가하지 마세요. 웨이크 락을 만드는 코드는 실행될 때마다 동일한 태그를 사용해야 합니다. 이렇게 하면 시스템에서 각 메서드의 wake lock 사용량을 집계할 수 있습니다.
앱이 포그라운드에 표시되는지 확인
웨이크락이 활성화되어 있는 동안 기기는 전원을 사용합니다. 기기의 사용자는 이러한 상황이 진행되고 있음을 인지해야 합니다. 따라서 wake lock을 사용하는 경우 사용자에게 알림을 표시해야 합니다. 즉, 포그라운드 서비스에서 wakelock을 가져와 유지해야 합니다. 포그라운드 서비스는 알림을 표시하는 데 필요합니다.
포그라운드 서비스가 앱에 적합하지 않은 경우 wake lock도 사용해서는 안 됩니다. 앱이 포그라운드에 있지 않을 때 작업을 실행하는 다른 방법은 기기를 깨어 있게 하는 적절한 API 선택 문서를 참고하세요.
로직을 단순하게 유지
wake lock을 획득하고 해제하는 로직은 가능한 한 단순해야 합니다. wake lock 로직이 복잡한 상태 시스템, 시간 제한, 실행기 풀 또는 콜백 이벤트에 연결되면 해당하는 로직의 미세한 버그로 인해 wake lock이 예상보다 더 오래 유지될 수 있습니다. 이러한 버그는 진단 및 디버그가 어렵습니다.
wake lock이 항상 해제되는지 확인
wake lock을 사용하는 경우 획득한 모든 wake lock이 올바르게 해제되는지 확인해야 합니다. 하지만 생각만큼 쉽지는 않습니다. 예를 들어 다음 코드에는 문제가 있습니다.
Kotlin
@Throws(MyException::class)
fun doSomethingAndRelease() {
wakeLock.apply {
acquire()
doTheWork() // can potentially throw MyException
release() // does not run if an exception is thrown
}
}
자바
void doSomethingAndRelease() throws MyException {
wakeLock.acquire();
doTheWork(); // can potentially throw MyException
wakeLock.release(); // does not run if an exception is thrown
}
여기서 문제는 doTheWork()
메서드가 MyException
예외를 발생시킬 수 있다는 점입니다. 예외가 발생하면 doSomethingAndRelease()
메서드가 예외를 외부로 전파하며 release()
호출에 도달하지 않습니다. 그 결과 wake lock이 획득되었지만 해제되지 않아 매우 좋지 않습니다.
수정된 코드에서 doSomethingAndRelease()
는 예외가 발생하더라도 wake lock을 해제합니다.
Kotlin
@Throws(MyException::class)
fun doSomethingAndRelease() {
wakeLock.apply {
try {
acquire()
doTheWork()
} finally {
release()
}
}
}
Java
void doSomethingAndRelease() throws MyException {
try {
wakeLock.acquire();
doTheWork();
} finally {
wakeLock.release();
}
}