Android12指纹框架完全解析(一)

前言:自从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/[email protected]...

从笔者的手机log输出中,可以看到指纹的init 文件是vendor/etc/init/[email protected]

通过指纹的init.rc 文件,启动/vendor/bin/hw/路径下面的[email protected]可执行文件


 

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 进程启动的时候,解析了[email protected]文件,通过此文件启动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函数

        

猜你喜欢

转载自blog.csdn.net/g241893312/article/details/128362006