安卓指纹启动流程

本文主要基于Android10.0系统开源代码介绍指纹识别模块的整体架构和启动流程。

一.指纹识别整体框架

结合上图,Android系统的指纹识别软件上主要分成4层:

  • 应用层:应用开发者调用AOSP提供的接口即可,AOSP接口即Android提供的通用接口,这些接口通过Binder与Framework层的指纹服务进行操作与数据传输;

  • Framework层:指纹Framework服务是承上启下的作用,上与应用层交互,下与HAL层交互;

  • HAL层:指纹识别的结果判断都来自硬件抽象层,是指纹识别的“灵魂”所在。这一层各手机厂商差异化的实现了各自的算法逻辑与结果反馈逻辑。

  • Driver层:驱动层接收HAL层的请求,直接控制了指纹硬件。



二.指纹识别启动流程

指纹启动流程分成两部分:Framework层的启动和HAL层的启动。两者各自独立启动,且启动时间顺序上没有严格的要求,Framework层启动之后会不断尝试链接HAL层直至链接成功。两者启动并且链接成功之后,应用层就可以顺利的进行指纹识别相关操作。

1. Framework层启动流程

1)Android系统启动的第一个进程是zygote,Framework层的服务启动就是从zygote的main函数开始:

2)SystemServer().run()函数接着调用startOtherServices()函数:

3)在startOtherServices()函数中,根据hasFeatureFingerprint判断系统是否支持指纹识别功能。如果支持会startService(FingerprintService.class)。

4)在startService方法中调用了一个关键的方法:service.onStart(),这个方法实现是在FingerprintService.java中。

5)至此已经跳转到Framework层核心文件FingerprintService.java,我们接着看下onStart函数做了哪些动作,FingerprintServiceWrapper函数创建Framework层自己的一些接口,我们主要注意getFingerprintDaemon这个函数。

6)getFingerprintDaemon函数首先调用getService函数不断尝试链接HAL层的进程,链接成功之后调用setNotify设置回调函数,最后加载用户相关数据。至此,Framework层已经启动完成。



2. HAL层启动流程

1)HAL层启动是通过rc文件完成的,具体路径如下:

2)这个rc文件拉起服务的源码可以从Android.bp中找到,即:BiometricsFingerprint.cpp和service.cpp。

3)Service.cpp是HAL层启动的入口文件。首先通过BiometricsFingerprint::getInstance()实例化一个bio服务,不同厂家的BiometricsFingerprint类可能不同,因此在指纹识别的效果上也就有不同的表现,getInstance()实例化过程比较重要,完成了大部分HAL层的初始化动作,我们在下一点重点介绍;bio服务实例化之后通过configureRpcThreadpool()设置允许HIDL通信的线程数量;然后再通过registerAsService()将HAL服务注册到serviceManager中,等待Framework层服务链接;最后调用joinRpcThreadpool将HAL层服务放到线程池中一直运行。

4)我们重点看一下实例化函数getInstance(),这个函数是BiometricsFingerprint类的方法,不同厂家的实现可能不同。首先会new出一个BiometricsFingerprint类,紧接着会调用构造函数,然后调用openHal()函数。

a. HAL服务调用hw_get_module函数通过FINGERPRINT_HARDWARE_MODULE_ID获取指纹模组厂商的so,这个ID的定义在/Android_Q/hardware/libhardware/modules/fingerprint/fingerprint.c这个路径:

b. 获取到指纹模组厂商的module之后,会调用对应的open函数,主要将模组的具体方法赋值给HAL的device,并设置回调函数用于HAL服务和指纹模组module之间的通信。

c. 原始Android系统中指纹模组的具体方法基本都是空实现,例如下图的fingerprint_enroll函数。这里正是需要对应指纹模组厂家去实现并接入的地方。



3. 指纹识别的通路

上面基本介绍完了指纹识别Framework层和HAL层的启动流程,我们可以将这两部分串起来看,大致通路如下:

FingerprintService.java->BiometricsFingerprint.cpp->fingerprint.c->FPIC_Hal.cpp->FPIC_CA.cpp->TEE.c->TA.c。

参考资料:

[1] https://source.android.google.cn/security/biometric?hl=zh_cn

[2] https://blog.csdn.net/weixin_43943188/article/details/88321101

长按关注

内核工匠微信

Linux 内核黑科技 | 技术文章 | 精选教程