Android12指纹框架流程介绍(一)
前言:根据网上的相关资料,Android 12开始支持屏下指纹方案,根据自己手中的测试机,
下载了android 12的源码,准备学习下新的指纹框架
注:目前笔者使用的版本是android_12.0.0_r34, 使用的测试手机是pixel 3xl
一.指纹启动过程
1.init进程 解析指纹init.rc 文件,启动对应的指纹service
init: Setting property 'ro.build.fingerprint' to 'Android/aosp_crosshatch/crosshatch:12/SP1A.210812.016.C2/eng.20221212.113415:userdebug/test-keys'
init: Parsing file /vendor/etc/init/android.hardware.biometrics.fingerprint@2.2-service.fpc.rc...
从笔者的手机log输出中,可以看到指纹的init 文件是vendor/etc/init/android.hardware.biometrics.fingerprint@2.2-service.fpc.rc
通过指纹的init.rc 文件,启动/vendor/bin/hw/路径下面的android.hardware.biometrics.fingerprint@2.1-service.fpc可执行文件
2.启动HAL层的指纹Service, 通过指纹HAL 通知TEE 去load 指纹TA
fpc_hidl pid-1297 D fpc fingerprint hwbinder service starting
zygote pid-1000 I option[47]=-Xfingerprint:Android/aosp_crosshatch/crosshatch:12/SP1A.210812.016.C2/eng.v00739.20221212.113415:userdebug/test-keys
<no-tag> pid-0 W c3 1297 QSEECOM: qseecom_load_app: App (fpctzappfingerprint) does'nt exist, loading apps for first time
<no-tag> pid-0 W c3 1297 QSEECOM: qseecom_load_app: App with id 2 (fpctzappfingerprint) now loaded
fpc_tac pid-1297 E fpcbuildinfo : ...
HidlServiceManagement pid-1297 I Registered android.hardware.biometrics.fingerprint@2.2::IBiome...
HidlServiceManagement pid-1297 I Removing namespace from process name android.hardware.biometri...
SystemConfig system_process I Reading permissions from /vendor/etc/permissions/android.hardw...
从上面的log中可以看出,在这里是启动了一个HIDL的指纹service, 在TEE 测load 了一个名字是fpctzappfingerprint的ta文件;
注意:其实在启动HIDL 指纹服务的时候,会调用指纹HAL层的代码
3.启动Framework层的FingerprintService
SystemServerTiming system_process I StartFingerprintSensor
SystemServiceManager system_process I Starting com.android.server.biometrics.sensors.fingerprint.Fin...
FintgerprintService system_process E FingerprintService
FintgerprintService system_process E onStart
SystemServer.java 中2466行的代码,启动了FingerprintService,BiometricService跟 AuthService; 这里先讲FingerprintService
调用了FingerprintService的构造函数跟onStart函数
FingerprintService.java的构造函数,创建了FingerprintServiceWrapper 包装类(是IFingerprintService 的服务器端)
FingerprintService.java的onStart 函数
通过publishBinderService 启动FingerprintServiceWrapper 远程服务
至此,Framework层指纹启动完毕,FingerprintServiceWrapper 等待客户端(FingerprintManager)的IPC调用
二.Framework指纹服务连接HAL层指纹服务
上面已经讲了指纹从开机到Framework层的启动流程,现在主要讲,Framework层指纹service怎么跟HAL层的指纹service 连接起来
重启手机后,看到如上的log, 发现有了FingerprintServiceWrapper的方法被调用的log;
FengLeiFin...intService system_process I FingerprintServiceWrapper registerAuthenticators
看了下代码,registerAuthenticators 是一个Binder 方法,然后在代码查找了下,发现被AuthService.java调用
可以看到AuthService.java中693行,调用了fingerprintService.registerAuthenticators这个函数,这个明显就是一个AIDL的客户端调用,就是在这里调用了
远程服务器FingerprintServiceWrapper的registerAuthenticators方法;这个方法,是被AuthService.java的registerAuthenticators函数调用,而AuthService.java的registerAuthenticators函数,又是被AuthService.java的onStart函数调用的
AuthService的启动,就是跟FingerprintService的启动是一样的,都是在SystemServer.java中被调用启动的,前面的代码有简单的介绍
整个调用流程如下: