Android Keyguard自Android L以來一直沒有多大變化。在Android L之前, Keyguard有自己獨立的進程,KeyguardService自開機時啟動並常駐。Android L之後到Android P,Keyguard和SystemUI共同享有一個進程。process i ...
Android Keyguard自Android L以來一直沒有多大變化。在Android L之前, Keyguard有自己獨立的進程,KeyguardService自開機時啟動並常駐。Android L之後到Android P,Keyguard和SystemUI共同享有一個進程。process id為com.android.systemui, Keyguard可以看做是SystemUI的一個lib庫。可表示為如下:
Keyguard架構有較大變化,同時Keyguard UI界面也有很大變化, 包含兩個主界面,一個是顯示Notification的主界面,稱為Notification Keyguard, 另一個是在系統鎖屏方式為安全鎖時用來用戶輸入密碼解鎖的界面,稱為Bouncer界面。如下圖所示(下麵左圖為Notification Keyguard界面, 上滑之後進入第二個界面,即Bouncer界面)。
一、System boot Create Keyguard Flow
KeyguardService在System boot ready時開始bind, 同時會根據用戶設置的鎖屏方式去create對應keyguard, 鎖屏方式可以分為None(無,即沒有鎖屏), Swipe(滑動,即滑動解鎖),Pattern(圖案,輸入圖案解鎖,密碼長度至少連接四個點), Password(密碼,輸入密碼解鎖,密碼由數字和字母組合組成,密碼長度至少為4),PIN(PIN, 密碼只包含數字, 密碼長度至少為4)。System boot時create keyguard flow如下:
下麵log是對應flow的關鍵log, 可以從log check create flow跑到了哪個階段,可以迅速的debug出問題。
二、系統滅屏時Create Keyguard Flow
在系統滅屏時,也會去create keyguard, 預設在power key滅屏之後會去立即create keyguard, 但如果沒有勾選"power key立即鎖屏",或者是timeout滅屏(即系統無操作,隔一段時間後自動熄屏),則預設會在滅屏之後隔5s才去create keyguard. 滅屏去create keyguard的flow與boot 時去create keyguard flow差不多,只是觸發條件不同而已,如下:
下麵log是對應滅屏create keyguard flow的關鍵log。
三、Power Key亮屏Flow
在系統亮屏時,會等keyguard畫好之後再亮屏(如果user有設置keyguard的話),即亮屏時會被keyguard block住,等keyguard畫完之後會通知PowerManagerService去亮屏。亮屏flow相對簡單,如下:
下麵log是對應power key亮屏 flow的關鍵log。
四、Dismiss Keyguard Flow
然後除了create keyguard外,另一重要的flow就是解鎖了,用戶滑動或者輸入密碼之後會去解鎖。由於Keyguard和SystemUI同屬一個進程,並與StatusBar共用一個window的關係,解鎖flow比前面稍微複雜一點。下麵是以pattern鎖為例解鎖flow圖:
下麵log是對應pattern鎖屏解鎖 flow的關鍵log。
至此,Keyguard幾個重要的flow都已介紹完畢,除了常規的鎖屏方式外,Android也支持人臉解鎖,語音解鎖,指紋解鎖。這些生物識別的解鎖方式也是需要Keyguard的配合才能完成,Android廠商如要開發自己的Keyguard, 不使用Android default Keyguard, 在接入這些生物識別的解鎖方式時,需要做一些修改來和自己的Keyguard適配。Hardware -> kernel -> HAL -> framework -> keyguard.