안녕하세요 KeyGuard(우리가 흔히 락스크린이라고 일컫는)와 관련된 정보를 공유하고자 이렇게 글을 써봅니다.


키가드 관련 개발 이슈는 보통 락스크린을 대신하거나 특정 액션 시 우리가 개발한(3rd party)앱이 키가드를 해제하고 노출시키는 것이 대부분인 것 같습니다.


저는 특히 2번 케이스를 중점적으로 기술하고자 합니다.

시나리오는 다음과 같습니다.

GCM 메세지를 수신하면 키가드 위로 앱의 특정 화면이 노출되고 해제되어 사용할 수 있어야 한다.


위 요구사항을 충족하기 위해 우리가 사용할 수 있는 방법은 2가지가 있습니다.


1. Window에 Flag를 추가하는 방법 (FLAG_DISMISS_KEYGUARD) [안드로이드 권장]

2. KeyguardManager.KeyguardLock의 disableKeyguard 를 사용하는 방법 [안드로이드 비권장] 


1방법의 경우는 오직 패턴이나 비밀번호로 보안설정이 되어 있지 않은 경우에만 유효합니다. 공식 레퍼런스에서 아래와 같이 설명하고 있기 때문입니다.

public static final int FLAG_DISMISS_KEYGUARD

Added in API level 5

Window flag: when set the window will cause the keyguard to be dismissed, only if it is not a secure lock keyguard.


즉, 이 플래그를 사용하는 것은 요구사항을 만족시키는 완전한 방법이 될 수 없습니다.


또한, 락스크린 위로 특정 화면(Activity)를 올리기 위해서는 FLAG_SHOW_WHEN_LOCKED와 함께 사용해야 하며, 해당 플래그가 FullScreen을 요구한다는 제약사항이 있습니다. (또한, 이경우 Style의 windowIsFloating Attribute와 함께 사용할 수 없습니다. 즉, Dialog Style의 화면을 구성할 수 없습니다. 관련 링크 첨부)


상기 정보로 판단컨대 안드로이드에서는 사용자 편의와 보안이라는 상반되는 가치 중 보안에 무게를 실어주는 것으로 보입니다.

(카카오톡을 예로 들자면 푸시 수신 시 잠금화면 위에 팝업뷰가 노출되고 '보기'를 누를 경우 패턴잠금화면이 노출되는 것은 Android SDK가 그렇게 되어 있기 때문입니다.)


2번 방법의 경우 제가 비권장이라고 기재한 이유는 해당 클래스 자체가 api level 13부터 deprecated되었기 때문입니다.

그러나 이 클래스의 disablekeyguard 메서드를 호출하면 일부 기기에서는 패턴이 걸려있던 없던 해제하고 우리 앱을 노출시킬 수 있습니다.


그러나, 이 방법은 크게 두 가지 문제가 있습니다.


(1) 단말별로 동작이 다르다.

안드로이드의 고질적인 문제입니다. 예를 들어 갤럭시 S5의 경우 해당 메서드를 아무리 호출해도 어떠한 효과를 볼 수 없는 반면, LG G3에서는 패턴이 풀리는 것을 확인할 수 있습니다. 베가나 다른 제조사 등은 물론 언급할 필요도 없을 것 같습니다.


(2) 해제 이후 잠금 화면 활성화의 문제

disablekeyguard 를 콜할 경우 어떤 시점에서는 반드시 reenablekeyguard를 호출해주어야 합니다. 이 절차를 수행하지 않는다면 화면잠금이 풀린 시점 이후 패턴락이 노출되지 않는 것을 확인할 수 있습니다. 락스크린을 대체하는 앱이 아닌 일반 앱에서 잠금화면을 임의의 필요에 의해 풀었다 하더라도 특정 동작 이후 또는 시점에서는 패턴잠금을 걸어줘야 하는데 이 흐름 자체가 바람직 하지 않으며 또한 해당 조건 자체가 애매할 수 있습니다.



한줄요약 : 만약 요구사항에서 개발해야 할 앱에서 비밀번호 또는 패턴잠금을 강제로 해제한다는 내용이 있다면 위에 내용을 참조하여 그건 OS 정책에 위배되는 것이라고 설명하고 반려해야 한다.



제가 요구사항을 구현하는 과정에서 경험한 이슈를 정리하고, 유사한 이슈를 경험할 다른 개발자분들에게 정보를 공유하는 차원에서 글을 올립니다.


상기 기술한 정보가 잘못되었거나 다른 대안이 있다면 언제든지 의견 주시면 커뮤니티에 많은 도움이 될 것 같네요.


대한민국 개발자분들 모두 화이팅입니다.!