先简单了解下HIDL的一些内容,有助于查看代码。
Android O之后Android全面引入了Treble架构,HAL层从简单的函数调用转变成了依靠binder的IPC通讯模式——HIDL。
根据Google的定义HIDL分为两种模式:Passthrough和Binderized;
Binderized(绑定试HAL):以 HAL 接口定义语言 (HIDL) 表示的 HAL。这些 HAL 取代了早期 Android 版本中使用的传统 HAL 和旧版 HAL。在绑定式 HAL 中,Android 框架和 HAL 之间通过 Binder 进程间通信 (IPC) 调用进行通信。所有在推出时即搭载了 Android 8.0 或后续版本的设备都必须只支持绑定式 HAL。
Passthrough(直通式HAL):以 HIDL 封装的传统 HAL 或旧版 HAL。这些 HAL 封装了现有的 HAL,可在绑定模式和 Same-Process(直通)模式下使用。升级到 Android 8.0 的设备可以使用直通式 HAL。
HAL 模式要求:
设备 | 直通式 | 绑定式 |
---|---|---|
搭载 Android 8.0 的设备 | 直通式 HAL 中列出的 HAL 必须为直通式。 | 所有其他 HAL 均为绑定式(包括作为供应商扩展程序的 HAL)。 |
升级到 Android 8.0 的设备 | 直通式 HAL 中列出的 HAL 必须为直通式。 | 绑定式 HAL 中列出的 HAL 必须为绑定式。 |
供应商映像提供的所有其他 HAL 既可以在直通模式下使用,也可以在绑定模式下使用。 |
Google有对一些设备做出规定,是使用直通式还是绑定式的HIDL。
其中指纹相关的HIDL被规定为绑定式的:
android.hardware.biometrics.fingerprint@2.1
。取代 Android 8.0 中已不存在的fingerprintd
。
和AIDL的.aidl文件类似,HIDL也有属于自己的.hal文件,它们通常位于以下目录中:
软件包前缀 | 位置 |
---|---|
android.hardware.* |
hardware/interfaces/* |
android.frameworks.* |
frameworks/hardware/interfaces/* |
android.system.* |
system/hardware/interfaces/* |
android.hidl.* |
system/libhidl/transport/* |
HAL层代码则主要位于以下目录下:
hardware/libhardware:新的HAL代码目录,符合android treble架构的设计
hardware/libhardware_legacy:老的HAL代码目录
hardware/ril:Radio Interface Layer(和TELE相关的一些东西,需要和MODEM交互)
HAL层上接Framework Service部分,故,以FingerprintService为切入点。
之前提到过frameworks\base\services\core\java\com\android\server\fingerprint中ClientMonitor类负责和HAL层交互;
/**
* Abstract base class for keeping track and dispatching events from fingerprint HAL to the
* the current client. Subclasses are responsible for coordinating the interaction with
* fingerprint HAL for the specific action (e.g. authenticate, enroll, enumerate, etc.).
*/
public abstract class ClientMonitor implements IBinder.DeathRecipient
这里可以找到使用的HAL对象:
import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
//...
/**
* Gets the fingerprint daemon from the cached state in the container class.
*/
public abstract IBiometricsFingerprint getFingerprintDaemon();
从这个import我们可以确认:
fingerprint的.hal文件目录为:hardware/interfaces/biometrics/fingerprint/2.1
文件名是:IBiometricsFingerprint.hal
然后到对应目录确认下:
嘿,还真的有!
这里先不管HAL层部分,先看看getFingerprintDaemon方法,这个方法定义在FingerprintServcie中:
public synchronized IBiometricsFingerprint getFingerprintDaemon() {
if (mDaemon ==