锁定屏幕

在 AOSP 中,具有解锁用户选项 (keyguard) 的锁定屏幕的默认实现仅出现在主显示屏上。在 Android 9(及更低版本)中,辅助屏幕在单个外部显示屏上支持单个锁定窗口。在 Android 10 中,锁定屏幕扩展到所有公共辅助显示屏。锁定屏幕仍然很简单,但不支持从辅助屏幕解锁。

图 1. 辅助屏幕上的锁定屏幕

如果满足基本安全要求,设备制造商可以为辅助显示屏实现其自己的锁定屏幕。当设备锁定时,信息应在所有屏幕上安全地隐藏起来。对于设备锁定时应显示或隐藏哪些内容,没有相关的内置政策或控制。因此,实现受限访问的唯一安全方式是,将所有内容隐藏到锁定屏幕和锁定窗口之后。仅有的例外情况是使用 R.attr.showWhenLockedActivity.setShowWhenLocked() 方法明确选择在锁定屏幕之上显示的应用。否则,信息很有可能从公共和个人屏幕泄露。

虽然屏幕可以处于不同的状态 (ON/OFF),但是锁定状态对所有屏幕而言是全局性的。与任何设备实现一样,应该让用户清楚地知道设备何时会锁定(或解锁)。例如,按下电源按钮通常会锁定移动设备。此外,电源按钮还应锁定所有内部和外部屏幕。

由于锁定窗口归 SystemUI 所有,因此不会放置在个人屏幕上。个人屏幕的所有者负责在设备锁定时隐藏窗口并保护内容。默认系统实现通过更改公开范围仅隐藏个人显示屏上的 activity。

实现

辅助屏幕上的锁定窗口在 KeyguardDisplayManager 中以 Presentation 窗口的形式实现。Android 10 将 KeyguardDisplayManager#mPresentations 更改为一个数组,其中包含所有辅助屏幕的所有锁定窗口。KeyguardDisplayManager 还包含一个屏幕更改监听器,可响应对可用屏幕的更改并保护所有屏幕。请务必在任何给定时间立即锁定所有连接的屏幕,这样,即使攻击者对设备进行物理访问,也无法提取用户数据。

锁定窗口会显示在所有公共辅助屏幕上(请参阅 KeyguardDisplayManager#isKeyguardShowable())。个人屏幕的所有者负责在设备锁定时保护内容。