Android P 指纹 HAL

本文介绍了Android P中引入的HIDL(硬件接口定义语言)在指纹HAL层的应用,探讨了Binderized HAL与Passthrough HAL的区别,并详细解析了指纹HAL的组件,包括FingerprintService、IBiometricsFingerprint接口、hw_module_t等关键结构,以及设备驱动的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先简单了解下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 ==
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值