잠금 화면

AOSP에서는 잠금 화면과 이를 잠금 해제하기 위한 어포던스(키가드)의 기본 구현이 기본 디스플레이에만 표시됩니다. Android 9 이하에서는 보조 화면에서 단일 외부 디스플레이의 단일 잠금 창을 지원했습니다. Android 10에서는 잠금 화면이 모든 공개 보조 디스플레이로 확장됩니다. 잠금 화면은 단순하게 유지되며 보조 화면 잠금 해제를 지원하지 않습니다.

그림 1. 보조 디스플레이 잠금 화면

기기 제조업체는 보조 디스플레이에 자체 잠금 화면을 구현할 수 있지만 기본적인 보안 요구사항이 이행되어야 합니다. 기기가 잠기면 정보가 모든 디스플레이에서 안전하게 가려져야 합니다. 기기가 잠겼을 때 어떤 콘텐츠를 표시하거나 숨겨야 하는지에 관한 기본적인 정책이나 제어 기능은 없습니다. 따라서 제한된 액세스를 구현할 수 있는 유일한 안전한 방법은 모든 콘텐츠를 잠금 화면과 잠금 창 뒤에 숨기는 것입니다. 유일한 예외는 R.attr.showWhenLocked 또는 Activity.setShowWhenLocked() 메서드를 사용하여 잠금 화면 상단에 표시되도록 명시적으로 선택한 앱입니다. 그러지 않으면 공개 및 비공개 디스플레이에서 정보가 유출될 가능성이 높습니다.

디스플레이는 다른 상태(ON/OFF)에 둘 수 있지만 잠김 상태는 모든 디스플레이에 전역적으로 적용됩니다. 모든 기기 구현과 마찬가지로 기기가 잠기거나 잠금 해제되면 사용자가 이를 쉽게 알 수 있어야 합니다. 보통 전원 버튼을 누르면 휴대기기가 잠깁니다. 전원 버튼을 누르면 모든 내부 및 외부 화면도 잠겨야 합니다.

잠금 창은 SystemUI 소유이므로 비공개 디스플레이에 배치되지 않습니다. 비공개 디스플레이 소유자는 기기가 잠겼을 때 창을 숨기고 콘텐츠를 보호해야 합니다. 기본 시스템 구현은 공개 상태를 변경하여 비공개 디스플레이의 활동만 숨깁니다.

구현

보조 디스플레이의 잠금 창은 KeyguardDisplayManagerPresentation 창으로 구현됩니다. Android 10에서는 KeyguardDisplayManager#mPresentations를 모든 보조 화면의 모든 잠금 창이 보관되는 배열로 변경했습니다. KeyguardDisplayManager에는 가용한 디스플레이의 변경사항에 응답하고 모든 화면을 보호하기 위한 디스플레이 변경 리스너도 있습니다. 공격자가 기기에 물리적으로 액세스하더라도 사용자 데이터를 추출할 수 없도록 항상 모든 연결된 디스플레이를 즉시 잠그는 것이 중요합니다.

잠금 창은 모든 공개 보조 디스플레이에 표시됩니다(KeyguardDisplayManager#isKeyguardShowable() 참고). 비공개 디스플레이 소유자는 기기가 잠겼을 때 콘텐츠를 보호해야 합니다.