鎖定畫面

AOSP 預設實作方式是,鎖定畫面會顯示解鎖功能 (鎖定畫面),但只會顯示在主要螢幕上。在 Android 9 (及以下版本) 中,次要螢幕支援在單一外接螢幕上顯示單一鎖定視窗。在 Android 10 中,螢幕鎖定畫面會擴展至所有公開的次要螢幕。鎖定畫面仍保持簡單,且不支援從次要畫面解鎖。

圖 1. 次要螢幕上的螢幕鎖定畫面

只要符合基本安全性需求,裝置製造商就可以為次要螢幕實作鎖定畫面。裝置鎖定時,所有螢幕上的資訊都應安全隱藏。系統並未內建政策或控制項,無法控制裝置鎖定時應顯示或隱藏哪些內容。因此,實施限制存取權的唯一安全方法,就是將所有內容隱藏在鎖定畫面和鎖定視窗後方。唯一的例外狀況是,應用程式已明確選擇使用 R.attr.showWhenLockedActivity.setShowWhenLocked() 方法,在螢幕鎖定畫面頂端顯示。否則,很可能會從公開和私人顯示畫面洩漏資訊。

雖然螢幕可處於不同的狀態 (ON/OFF),但鎖定狀態是所有螢幕的全球狀態。如同任何裝置實作方式,使用者應能清楚瞭解裝置是否已鎖定 (或解鎖)。舉例來說,按下電源鍵通常會鎖定行動裝置。電源鍵也應鎖定所有內部和外部螢幕。

由於鎖定視窗由 SystemUI 擁有,因此不會放置在私人顯示畫面上。私人螢幕的擁有者有責任在裝置鎖定時隱藏視窗並保護內容。預設的系統實作方式「只會」透過變更隱藏狀態,隱藏私人螢幕上的活動。

實作

在次要螢幕上鎖定的視窗會在 KeyguardDisplayManager 中實作為 Presentation 視窗。Android 10 將 KeyguardDisplayManager#mPresentations 變更為陣列,可保留所有次要螢幕的所有鎖定視窗。KeyguardDisplayManager 也設有顯示器變更事件監聽器,可回應可用顯示器的變更,並保護所有畫面。請務必隨時立即鎖定所有已連結的螢幕,這樣即使攻擊者可以存取裝置,也無法擷取使用者資料。

鎖定視窗會顯示在所有公開的次要螢幕上 (請參閱 KeyguardDisplayManager#isKeyguardShowable())。私人螢幕的擁有者有責任在裝置鎖定時保護內容。