AOSP のデフォルト実装では、ロックを解除するアフォーダンス付きロック画面(キーガード)がプライマリ ディスプレイにのみ表示されます。Android 9 以前では、セカンダリ画面は 1 つの外部ディスプレイ上の 1 つのロック ウィンドウをサポートしていました。Android 10 では、ロック画面がすべての公開セカンダリ ディスプレイに拡張されています。ロック画面はシンプルなままで、セカンダリ画面からのロック解除はサポートされていません。
図 1. セカンダリ ディスプレイのロック画面
基本的なセキュリティ要件を満たせば、デバイス メーカーはセカンダリ ディスプレイのロック画面を実装できます。デバイスがロックされたときに、すべてのディスプレイで情報が確実に隠される必要があります。デバイスのロック時に表示または非表示にするコンテンツに関するポリシーまたは制御は組み込まれていません。したがって、制限付きアクセスを実装する安全な方法は、ロック画面とロック ウィンドウの背後にあるすべてのコンテンツを非表示にすることだけです。唯一の例外は、R.attr.showWhenLocked
または Activity.setShowWhenLocked()
メソッドを使用してロック画面の前面に表示されるように明示的にオプトインしたアプリです。
これ以外の方法では、公開ディスプレイと非公開ディスプレイから情報が漏れる可能性が高くなります。
それぞれのディスプレイは異なる状態(ON
または OFF
)にできますが、ロック状態はすべてのディスプレイに一様に適用されます。どのようなデバイス実装でも、デバイスがロック(またはロック解除)されていることがユーザーに明確にわかる必要があります。たとえば、電源ボタンを押すと通常はモバイル デバイスがロックされますが、それと同時に、内部、外部のすべての画面がロックされる必要があります。
ロック ウィンドウは SystemUI が所有しているため、非公開ディスプレイには配置されません。非公開ディスプレイの所有者は、デバイスのロック時にウィンドウを隠してコンテンツを保護する責任があります。デフォルトのシステム実装は、表示設定を変更して非公開ディスプレイ上のアクティビティを非表示にするだけです。
実装
セカンダリ ディスプレイのロック ウィンドウは、KeyguardDisplayManager
のプレゼンテーション ウィンドウとして実装されます。Android 10 では、KeyguardDisplayManager#mPresentations
がすべてのセカンダリ画面のすべてのロック ウィンドウを保持する配列に変更されました。KeyguardDisplayManager
には、使用可能なディスプレイの変更に応答してすべての画面を保護するディスプレイ変更リスナーもあります。攻撃者がデバイスに物理的にアクセスしてもユーザーデータを抽出できないように、接続されているすべてのディスプレイをいつでもすぐにロックできることが重要です。
ロック ウィンドウは、すべての公開セカンダリ ディスプレイに表示されます(KeyguardDisplayManager#isKeyguardShowable()
を参照)。非公開ディスプレイの所有者は、デバイスがロックされたときにコンテンツを保護する責任があります。