ロック画面

AOSP のデフォルトのロック画面実装 (キーガード) は、プライマリ ディスプレイにのみ表示されます。 Android 9 (およびそれ以前) では、セカンダリ画面は 1 つの外部ディスプレイ上の 1 つのロック ウィンドウをサポートしていました。 Android 10 では、ロック画面がすべてのパブリック セカンダリ ディスプレイに拡張されます。ロック画面はシンプルなままで、セカンダリ画面からのロック解除はサポートされていません。

図 1.セカンダリ ディスプレイのロック画面

基本的なセキュリティ要件が満たされていれば、デバイス メーカーはセカンダリ ディスプレイにロック画面を実装できます。デバイスがロックされているときは、すべてのディスプレイ上の情報が安全に隠される必要があります。デバイスがロックされているときにどのコンテンツを表示または非表示にするかを制御するポリシーや制御は組み込まれていません。したがって、アクセス制限を実装する唯一の安全な方法は、すべてのコンテンツをロック画面とロック ウィンドウの背後に隠すことです。唯一の例外は、 R.attr.showWhenLockedメソッドまたはActivity.setShowWhenLocked()メソッドを使用して、ロック画面の上部に表示されるように明示的にオプトインしたアプリです。そうしないと、パブリックおよびプライベートのディスプレイから情報が漏洩する可能性が高くなります。

ディスプレイはさまざまな状態 ( ON / OFF ) に設定できますが、ロックされた状態はすべてのディスプレイに対してグローバルです。他のデバイス実装と同様に、デバイスがいつロックされているか (またはロックが解除されているか) がユーザーにとって明らかである必要があります。たとえば、通常、電源ボタンを押すとモバイル デバイスがロックされます。電源ボタンもすべての内部および外部画面をロックする必要があります。

ロック ウィンドウは SystemUI によって所有されているため、プライベート ディスプレイには配置されません。プライベート ディスプレイの所有者は、デバイスがロックされているときにウィンドウを非表示にし、コンテンツを保護する責任があります。デフォルトのシステム実装では、可視性を変更することによってプライベート ディスプレイ上のアクティビティのみを非表示にします。

実装

セカンダリ ディスプレイのロック ウィンドウは、 KeyguardDisplayManagerプレゼンテーションウィンドウとして実装されます。 Android 10 ではKeyguardDisplayManager#mPresentationsすべてのセカンダリ画面のすべてのロック ウィンドウを保持する配列に変更されました。 KeyguardDisplayManagerには、使用可能なディスプレイの変更に応答し、すべての画面を保護するためのディスプレイ変更リスナーもあります。攻撃者がデバイスに物理的にアクセスしてもユーザー データを抽出できないように、接続されているすべてのディスプレイを常に即座にロックすることが重要です。

ロック ウィンドウは、すべてのパブリック セカンダリ ディスプレイに表示されます ( KeyguardDisplayManager#isKeyguardShowable()を参照)。プライベート ディスプレイの所有者は、デバイスがロックされているときにコンテンツを保護する責任があります。