wake lock을 사용하면 기기 성능이 저하될 수 있습니다. 절전 모드 해제 잠금을 사용해야 하는 경우 올바르게 사용하는 것이 중요합니다. 이 문서에서는 일반적인 절전 모드 문제점을 방지하는 데 도움이 되는 몇 가지 권장사항을 다룹니다.
wake lock 이름을 올바르게 지정
패키지, 클래스 또는 메서드 이름을 wakelock 태그에 포함하는 것이 좋습니다. 이렇게 하면 오류가 발생할 경우 웨이크 락이 생성된 소스 코드의 위치를 더 쉽게 찾을 수 있습니다. 다음은 몇 가지 추가적인 도움말입니다.
- 이름에서 이메일 주소와 같은 개인 식별 정보(PII)를 제외하세요. 기기에서 웨이크 락 태그에 PII를 감지하면 지정한 태그 대신
_UNKNOWN
을 로깅합니다. - 프로그래매틱 방식으로 클래스 또는 메서드 이름을 가져오지 마세요(예:
getName()
호출). 프로그래매틱 방식으로 이름을 가져오려고 하면 Proguard와 같은 도구로 난독화될 수 있습니다. 대신 하드 코딩된 문자열을 사용하세요. - 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()
호출에 도달하지 않습니다. 결과적으로 절전 모드 해제 잠금이 획득되지만 해제되지 않으며 이는 매우 좋지 않습니다.
수정된 코드에서 doSomethingAndRelease()
는 예외가 발생하더라도 절전 모드 해제 잠금을 해제합니다.
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();
}
}