欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

全面解析Android系统指纹启动流程

程序员文章站 2022-04-29 09:18:20
本章主要整理android 指纹启动流程,侧重于hal和framework部分。一.从android系统启动流程看指纹启动流程下图图片出处→第一阶段boot rom,android设备上电后,首先会从...

本章主要整理android 指纹启动流程,侧重于hal和framework部分。

一.从android系统启动流程看指纹启动流程

下图图片出处  →

全面解析Android系统指纹启动流程

第一阶段

boot rom,android设备上电后,首先会从处理器片上rom的启动引导代码开始执行,片上rom会寻找bootloader代码,并加载到内存。主要就是上电让系统启动。

第二阶段

bootloader开始执行,首先负责完成硬件的初始化,然后找到linux内核代码,并加载到内存。

启动过程中,bootloader(默认是bootable/bootloader/lk)会根据机器硬件信息选择合适的devicetree(dts)装入内存,如果采用pin id兼容,那么在此时就可以通过读取id pin的值(这个是硬件拉的,跟硬件工程师确认是怎么对应ic的即可)判断指纹的ic了。

第三阶段

kernel,linux内核开始启动,初始化各种软硬件环境,加载驱动程序,挂载根文件系统,在系统文件中寻找init.rc文件,并启动init进程。kernel中,加载指纹驱动,根据传入的dts信息创建设备节点,注册设备。

第四阶段

init,初始化和启动属性服务,并且启动zygote进程。

找到android.hardware.biometrics.fingerprint@2.1-service.rc,启动android.hardware.biometrics.fingerprint@2.1-service,会去open  fingerprint.deault.so,等待与上层通信。

第五阶段

zygote进程启动,创建java虚拟机并为java虚拟机注册jni方法,创建服务器端socket,启动systemserver进程。

第六阶段

systemserver进程启动,启动binder线程池和systemservicemanager,并且启动各种系统服务。会启动fingerprintservice

 以上是从android启动流程看每个阶段指纹的启动流程 ,下面依次详细展开介绍。

二.驱动层     

主要就是设备节点驱动的注册,在此不再详细说了,重点关注probe函数。

三.hal层

首先,hardware/interfaces/biometrics/fingerprint/2.1/default/android.hardware.biometrics.fingerprint@2.1-service.rc(以下简称2.1 rc)

会使位于系统vendor/bin/hw下的android.hardware.biometrics.fingerprint@2.1-service(以下简称2.1 bin)开机自启动,启动后会注册2.1 service

该bin服务对应的代码在:hardware/interfaces/biometrics/fingerprint/2.1/default/service.cpp,整个注册过程只有两步,首先实例化传入的 ibiometricsfingerprint 接口对象,然后通过 registerasservice 将服务注册到 hwservicemanager。

hardware/interfaces/biometrics/fingerprint/2.1/default/biometricsfingerprint.cpp,重点关注openhal函数,会去打开fingerprint.default.so

关于fingerprint.default.so这个都是供应商提供的,一般都不开源,不过android原生也是有这部分代码的(当然只是看看,并不能使用)

hardware/libhardware/include/hardware/fingerprint.h

hardware/libhardware/modules/fingerprint/fingerprint.c

这部分代码不再展开贴在这里了,大家可以自行去看看,主要就是fingerprint_open打开设备(设备节点),然后定义了一系列函数。

四.framework层

首先是systemserver启动后,会去判断设备是否支持指纹,如果有start  fingerprintservice

frameworks/base/services/java/com/android/server/systemserver.java

此处mpackagemanager.hassystemfeature(packagemanager.feature_fingerprint)的判断,大家可以去frameworks/base/core/java/android/content/pm/packagemanager.java中追代码看看,逻辑很简单。

就是判断系统内vendor/etc/permissions目录下是否有:android.hardware.fingerprint.xml 文件

调试的那篇说过这个配置是setting里有没有指纹选项的关键:

下面转到,frameworks/base/services/core/java/com/android/server/fingerprint/fingerprintservice.java,以下代码前半部分是与hal 2.1 service通信的部分,通过mdaemon = ibiometricsfingerprint.getservice(),获取2.1 service

后半部分可以看出其继承ifingerprintservice.aidl,这个aidl类就是实现manager和service通信的桥梁。

对fingerprintservice再往上一层的封装是fingerprintmanager,应用app可以直接和它通信

frameworks/base/core/java/android/hardware/fingerprint/fingerprintmanager.java  (以下为搜索mservice的代码,大家可以自己去看看)

以上代码大家可以发现fingerprintmanager其实并没有真正实现什么接口,都是调用的ifingerprintservice,这里就用到aidl了,fingerprintmanager通过aidl的stub获取了fingerprintservice,然后在这里去调用这个service的方法,以操作service,这就是aidl的作用。

frameworks/base/core/java/android/hardware/fingerprint/ifingerprintservice.aidl (大家如果去看完整的代码,这里的接口是和fingerprintmanager中调用的完全一致的)

五.总结

根据以上可以画出这样一张流程图(以下以汇顶指纹为例,流程上都是一样的)

system app下发注册命令->fingerprintmanager收到命令->fingerprintservice收到命令->(2.1 service)biometricsfingerprint收到命令->(fingerprint.default.so)fingerprint.cpp收到命令->指纹ca收到命令->指纹ta收到命令->spi采集数据\算法进行注册等

全面解析Android系统指纹启动流程

以上就是全面解析android系统指纹启动流程的详细内容,更多关于android启动流程的资料请关注其它相关文章!