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/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函数

        

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
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文件中声明相应的权限和特性,例如声明指纹硬件的权限和声明应用支持指纹的特性。 希望以上信息能对你有所帮助!如果有任何进一步的问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

梦想全栈程序猿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值