安卓指纹启动流程

本文主要基于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 内核黑科技 | 技术文章 | 精选教程

  • 8
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
Android提供了一个指纹识别框架,用于在设备上进行指纹识别和验证。这个框架是通过FingerprintManager类来实现的。使用该框架,可以让用户通过指纹来进行设备解锁、应用授权等操作。 以下是使用Android指纹框架的一般步骤: 1. 确保设备支持指纹识别。可以通过调用FingerprintManager的isHardwareDetected()方法来检查设备是否支持指纹识别。 2. 获取指纹管理器的实例。可以通过调用FingerprintManager的getInstance()方法来获取指纹管理器的实例。 3. 创建指纹识别回调。需要实现FingerprintManager.AuthenticationCallback接口,并重写onAuthenticationError()、onAuthenticationHelp()、onAuthenticationSucceeded()和onAuthenticationFailed()等方法,以处理指纹识别过程中的错误、帮助信息和成功等回调。 4. 开始指纹识别。调用FingerprintManager的authenticate()方法,并传入一个CancellationSignal对象和一个带有指纹识别回调的Handler对象,以开始指纹识别过程。 5. 处理指纹识别回调。在指纹识别回调中,根据不同的回调类型进行相应的处理,例如显示错误信息、提示用户操作等。 需要注意的是,使用Android指纹框架需要在AndroidManifest.xml文件中声明相应的权限和特性,例如声明指纹硬件的权限和声明应用支持指纹的特性。 希望以上信息能对你有所帮助!如果有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

内核工匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值