人脸解锁从底层到上层(一)

前言

本系列将探索 Android 原生人脸解锁,从底层介绍到上层,涉及底层硬件、驱动、系统服务、框架、应用、跨进程通信、接口定义语言等知识。欢迎和我一起探讨,指出我的错误或不足,完善该系列,帮助更多有需要的人。

人脸解锁概述

人脸解锁即用户通过注视设备的正面方便地解锁手机或平板。Android 10 为支持人脸解锁的设备在人脸认证期间添加了一个新的可以安全处理相机帧、保持隐私与安全的人脸认证栈的支持,也为安全合规地启用集成交易的应用(网上银行或其他服务)提供了一种容易实现的方式。

Android 原生的人脸认证栈在 Android 10 是一种新的实现,与 Android P 不一样了。新的实现介绍了 IBiometricsFace.halIBiometricsFaceClientCallback.haltypes.hal 这些接口。

架构

这里要说到 BiometricsPrompt 这个 API,它囊括了 Android 所有生物识别,包括人脸、指纹、虹膜。人脸 HAL 与如下组件进行交互(HAL 全称硬件抽象层):

生物认证栈

可以看到,通过 FingerprintManager 实现支持库和系统服务之间的通信在 Android P 被废弃了,在 Android 10 或者更高的版本通过 BiometricManager 实现支持库和系统服务之间的通信,系统服务和驱动以及硬件通信,打通从底层到上层,从而实现人脸解锁。BiometricManagerBiometricService 对应到人脸解锁分别使用 FaceManagerFaceService,驱动及硬件实现规定为 faced

实现

faced 是实现了 FaceService 使用的 Face 1.0 HIDL 接口的 Linux 可执行文件,其注册自己为 IBiometricsFace@1.0 以便 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 风格的注解。

参考资料

[1] Face Authentication HIDL

[2] Interface description language

[3] HIDL

posted on 2019-12-29 00:43  差唔多先生  阅读(770)  评论(0编辑  收藏  举报

导航