螢幕鎖定

AOSP 預設實作方式會在主螢幕上顯示鎖定畫面,並提供解鎖功能 (鎖定畫面)。在 Android 9 (及以下版本) 中,次要螢幕支援在單一外接螢幕上顯示單一鎖定視窗。在 Android 10 中,螢幕鎖定畫面會擴充至所有公開的次要螢幕。螢幕鎖定畫面依舊簡單,且不支援透過次要螢幕解鎖。

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

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

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

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

實作

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

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