前言
本系列將探索 Android 原生人臉解鎖,從底層介紹到上層,涉及底層硬件、驅動、系統服務、框架、應用、跨進程通信、接口定義語言等知識。歡迎和我一起探討,指出我的錯誤或不足,完善該系列,幫助更多有需要的人。
人臉解鎖概述
人臉解鎖即用戶通過注視設備的正面方便地解鎖手機或平板。Android 10 爲支持人臉解鎖的設備在人臉認證期間添加了一個新的可以安全處理相機幀、保持隱私與安全的人臉認證棧的支持,也爲安全合規地啓用集成交易的應用(網上銀行或其他服務)提供了一種容易實現的方式。
Android 原生的人臉認證棧在 Android 10 是一種新的實現,與 Android P 不一樣了。新的實現介紹了 IBiometricsFace.hal
,IBiometricsFaceClientCallback.hal
和 types.hal
這些接口。
架構
這裏要說到 BiometricsPrompt
這個 API,它囊括了 Android 所有生物識別,包括人臉、指紋、虹膜。人臉 HAL 與如下組件進行交互(HAL 全稱硬件抽象層):
可以看到,通過 FingerprintManager
實現支持庫和系統服務之間的通信在 Android P 被廢棄了,在 Android 10 或者更高的版本通過 BiometricManager
實現支持庫和系統服務之間的通信,系統服務和驅動以及硬件通信,打通從底層到上層,從而實現人臉解鎖。BiometricManager
、 BiometricService
對應到人臉解鎖分別使用 FaceManager
、 FaceService
,驅動及硬件實現規定爲 faced
。
實現
faced
是實現了 FaceService
使用的 Face 1.0 HIDL
接口的 Linux 可執行文件,其註冊自己爲 [email protected]
以便 FaceService
可以找到它。
IDL
講 HIDL 之前先講講 IDL,因爲後面還會出現 AIDL,所以先做點知識儲備,以防不時之需。
IDL 全稱 interface description language 或者 interface definition language,是一種用於描述軟件組件的應用編程接口的規範語言。IDLs 通過一種語言獨立的方式描述接口,使得軟件組件之間的通信不用共享同一種編程語言,例如在那些用 C++ 編寫的程序和用 Java 編寫的程序之間的通信。
IDLs 常被用於遠程過程調用軟件。這些情況在連接的兩端的機器可能使用不同的操作系統和計算機語言。IDLs 爲兩個不同的操作系統提供了一座橋樑。
HIDL
HAL 即 Hardware Abstract Layer,全稱硬件抽象層。HAL 接口定義語言或者 HIDL 是一種指定一個 HAL 和它的使用者之間的接口的接口定義語言(IDL)。它允許指定收集到接口和包中的類型和方法調用。更廣泛地,HIDL 是一個用於可能被獨立編譯的代碼庫之間的通信系統。
HIDL 旨在用於跨進程通信(IPC)。進程間的通信被稱爲綁定(Binderized)。對於必須鏈接到一個進程的庫,直通模式也是可用的(不支持 Java)。
HIDL 指定數據結構和方法簽名,這些結構和方法簽名以收集到包中的接口(類似於類)進行組織。雖然 C++ 和 Java 編程者使用一組不同的關鍵字,但是 HIDL 的語法看起來很熟悉。HIDL 也使用 Java 風格的註解。
參考資料
[2] Interface description language
[3] HIDL