前言:自从Android6.0开始Google官方出了标准的Android指纹框架,结束了各家指纹厂商各自为政的局面,推动了电容指纹在Android的发展;自从2017年新思的屏下指纹方案横空出世,后边汇顶等指纹厂商跟进,Android 屏下指纹方案技术层出不穷;不过在Android12开始,Google 更新了Android指纹框架,添加了屏下指纹的支持,本文章会一一讲解新的指纹框架,也是为记录自己的学习过程
注:目前指纹框架代码修改比较大,笔者手上是android_12.0.0_r34, 使用的测试手机是pixel 3xl
一.指纹的启动过程
1.init 进程解析init.rc文件启动HAL层指纹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层指纹serivce并通知TEE环境Load指纹TA
从上面的log中可以看到两个关键点
pid-1297 D fpc fingerprint hwbinder service starting
QSEECOM: qseecom_load_app: App with id 2 (fpctzappfingerprint) now loaded
可以看出,启动HAL层指纹service, 调用指纹Hal 层代码,通知TEE去load名字叫
fpctzappfingerprint 的程序
注意:这里先暂时跳过HAL层的讲解
总结:
- init 进程启动的时候,解析了android.hardware.biometrics.fingerprint@2.2-service.fpc.rc文件,通过此文件启动HAL 指纹Service
- 指纹Service在启动过程中,回去通知TEE去load名字叫fpctzappfingerprint 的程序
3.启动Framework层指纹service
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行到2478行,分别启动了FingerprintService,BiometricService跟
AuthService这三个Framework层的系统将服务;将会调用这三个系统级服务的构造函数跟oStart方法
FingerprintService的构造函数,创建了一个FingerprintServiceWrapper类的对象,然后FingerprintService的onStart方法,调用了publishBinderService方法
FingerprintServiceWrapper继承了IFingerprintService.Stub方法,并通过上面的publishBinderService方法;启动了这个FingerprintServiceWrapper 远程服务端,
通过168行的注释,知道其客户端就是FingerprintManager,后边可以验证是否正确
/**
* Receives the incoming binder calls from FingerprintManager.
*/
总结:
- SystemServer 调用FingerprintService的构造函数跟onStart方法
- FingerprintService在其构造函数创建了一个FingerprintServiceWrapper类的对象
这个类是一个Binder的远程服务器 - FingerprintService在onStart方法中,启动了FingerprintServiceWrapper这个远处服务器
二.Framework指纹服务连接HAL层指纹服务
上面已经讲了,指纹从开机启动到Framework的启动流程;Hal层指纹service跟Framework指纹service都已经各自启动了;但是目前还没有牵桥搭线
FingeprintintService I FingerprintServiceWrapper registerAuthenticators
经过无数的Log跟踪打印之后,发现了FingerprintServiceWrapper的registerAuthenticators方法会被调用
然后通过代码搜索发现其会被AuthService.java的registerAuthenticators方法调用
进入到AuthService.java文件中,registerAuthenticators方法如下
690到693行代码中,发现是IFingerprintService接口的实现类,调用了IFingerprintService接口的registerAuthenticators;可以从其中猜测,这个mInjector.getFingeprintService()获取到的是上面介绍的FingerprintServiceWrapper服务器做对应的客户端,所以通过registerAuthenticators方法,最终调用到了服务器端FingerprintServiceWrapper的registerAuthenticators方法;
通过跟踪,发现AuthService的registerAuthenticators方法,是被其onStart方法调用的;所以现在的比较明朗,AuthService的onStart方法,也是因为AuthService被SystemServer调用而被调用的
总结:
- SystemServer 调用AuthService的构造函数跟onStart方法
- AuthService在onStart方法中,调用了自己的registerAuthenticators方法,
通过获取FingerprintServiceWrapper服务器对应的客户端,调用了远程服务器
FingerprintServiceWrapper的registerAuthenticators函数