FingerprintService启动-Android13

FingerprintService启动-Android13

  • 1、指纹服务启动
    • 1.1 rc启动Binder对接指纹厂商TA库
    • 1.2 FingerprintService启动
      • 1.2.1 SystemServer启动FingerprintService
      • 1.2.2 注册Binder服务fingerprint
  • 2、获取底层信息
    • 2.1 AIDL 对接TA中获取
    • 2.2 指纹类型判断

android13-release


1、指纹服务启动

1.1 rc启动Binder对接指纹厂商TA库

android虚拟设备 这里android.hardware.biometrics.fingerprint@2.1-service.rc,实际现在Android 13上使用 AIDL 调用指纹厂商TA so库
(HIDL转换AIDL了解一下:AOSP > 文档 > 核心主题 > HIDL;对于fwk层实质是一样的,之前只是区分hwBinder域,这里注册的Binder服务android.hardware.biometrics.fingerprint@2.1::IBiometricsFingerprint/default

12-24 09:54:06.228     0     0 I init    : Parsing file /vendor/etc/init/android.hardware.biometrics.fingerprint@2.1-service.rc...
12-24 09:54:16.601   511   511 D android.hardware.biometrics.fingerprint@2.1-service: Opening fingerprint hal library...
12-24 09:54:16.616   511   511 D FingerprintHal: ----------------> fingerprint_open ----------------->
12-24 09:54:16.616   511   511 D FingerprintHal: ----------------> set_notify_callback ----------------->
12-24 09:54:16.616   511   511 D FingerprintHal: fingerprint callback notification set
12-24 09:54:16.620   511   526 D FingerprintHal: ----------------> listenerFunction ----------------->
12-24 09:54:16.646   511   511 I HidlServiceManagement: Registered android.hardware.biometrics.fingerprint@2.1::IBiometricsFingerprint/default
12-24 09:54:16.646   511   511 I HidlServiceManagement: Removing namespace from process name android.hardware.biometrics.fingerprint@2.1-service to fingerprint@2.1-service.

在这里插入图片描述

1.2 FingerprintService启动

1.2.1 SystemServer启动FingerprintService

12-24 09:54:36.628   606   606 D SystemServerTiming: StartFingerprintSensor
12-24 09:54:36.628   606   606 I SystemServiceManager: Starting com.android.server.biometrics.sensors.fingerprint.FingerprintService
12-24 09:54:36.629   606   606 V SystemServerTiming: StartFingerprintSensor took to complete: 1ms

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

if (hasFeatureFingerprint) {
    t.traceBegin("StartFingerprintSensor");
    final FingerprintService fingerprintService =
            mSystemServiceManager.startService(FingerprintService.class);
    t.traceEnd();
}

// Start this service after all biometric sensor services are started.
t.traceBegin("StartBiometricService");
mSystemServiceManager.startService(BiometricService.class);
t.traceEnd();

t.traceBegin("StartAuthService");
mSystemServiceManager.startService(AuthService.class);
t.traceEnd();

1.2.2 注册Binder服务fingerprint

接收来自FingerprintManager的调用

frameworks/base/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java

    public FingerprintService(Context context) {
        super(context);
        mServiceWrapper = new FingerprintServiceWrapper();
        mAppOps = context.getSystemService(AppOpsManager.class);
        mGestureAvailabilityDispatcher = new GestureAvailabilityDispatcher();
        mLockoutResetDispatcher = new LockoutResetDispatcher(context);
        mLockPatternUtils = new LockPatternUtils(context);
        mServiceProviders = new ArrayList<>();
        mBiometricStateCallback = new BiometricStateCallback();
        mAuthenticatorsRegisteredCallbacks = new RemoteCallbackList<>();
        mSensorProps = new ArrayList<>();
        mHandler = new Handler(Looper.getMainLooper());
    }

    @Override
    public void onStart() {
        publishBinderService(Context.FINGERPRINT_SERVICE, mServiceWrapper);
    }

2、获取底层信息

实际获取在AuthService服务调用fingerprintService.registerAuthenticators(hidlFingerprintSensors);

frameworks/base/services/core/java/com/android/server/biometrics/AuthService.java

    /**
     * Registration of all HIDL and AIDL biometric HALs starts here.
     * The flow looks like this:
     * AuthService
     * └── .onStart()
     *     └── .registerAuthenticators(...)
     *         ├── FaceService.registerAuthenticators(...)
     *         │   └── for (p : serviceProviders)
     *         │       └── for (s : p.sensors)
     *         │           └── BiometricService.registerAuthenticator(s)
     *         │
     *         ├── FingerprintService.registerAuthenticators(...)
     *         │   └── for (p : serviceProviders)
     *         │       └── for (s : p.sensors)
     *         │           └── BiometricService.registerAuthenticator(s)
     *         │
     *         └── IrisService.registerAuthenticators(...)
     *             └── for (p : serviceProviders)
     *                 └── for (s : p.sensors)
     *                     └── BiometricService.registerAuthenticator(s)
     */
    @Override
    public void onStart() {
        mBiometricService = mInjector.getBiometricService();

        final SensorConfig[] hidlConfigs;
        if (!mInjector.isHidlDisabled(getContext())) {
            final int firstApiLevel = SystemProperties.getInt(SYSPROP_FIRST_API_LEVEL, 0);
            final int apiLevel = SystemProperties.getInt(SYSPROP_API_LEVEL, firstApiLevel);
            String[] configStrings = mInjector.getConfiguration(getContext());
            if (configStrings.length == 0 && apiLevel == Build.VERSION_CODES.R) {
                // For backwards compatibility with R where biometrics could work without being
                // configured in config_biometric_sensors. In the absence of a vendor provided
                // configuration, we assume the weakest biometric strength (i.e. convenience).
                Slog.w(TAG, "Found R vendor partition without config_biometric_sensors");
                configStrings = generateRSdkCompatibleConfiguration();
            }
            hidlConfigs = new SensorConfig[configStrings.length];
            for (int i = 0; i < configStrings.length; ++i) {
                hidlConfigs[i] = new SensorConfig(configStrings[i]);
            }
        } else {
            hidlConfigs = null;
        }

        // Registers HIDL and AIDL authenticators, but only HIDL configs need to be provided.
        registerAuthenticators(hidlConfigs);

        mInjector.publishBinderService(this, mImpl);
    }

下面日志是之前的HAIL:

12-24 09:54:36.650   606   606 D AuthService: Registering HIDL ID: 0 Modality: 2 Strength: 15
12-24 09:55:05.131   606  1740 D Fingerprint21: Daemon was null, reconnecting, current operation: null
12-24 09:55:05.186   606  1740 D Fingerprint21: Fingerprint HAL ready, HAL ID: 132452338342080
12-24 11:05:23.563   606   606 D Fingerprint21: handleError, client: FingerprintEnrollClient, error: 5, vendorCode: 0

2.1 AIDL 对接TA中获取

addAidlProviders() 获取TA信息,fp.getSensorProps()现在指纹类型显示位置从HAL中获取,转化成FingerprintSensorPropertiesInternal
在这里插入图片描述

private void addAidlProviders() {
    final String[] instances = ServiceManager.getDeclaredInstances(IFingerprint.DESCRIPTOR);
    if (instances == null || instances.length == 0) {
        return;
    }
    for (String instance : instances) {
        final String fqName = IFingerprint.DESCRIPTOR + "/" + instance;
        final IFingerprint fp = IFingerprint.Stub.asInterface(
                Binder.allowBlocking(ServiceManager.waitForDeclaredService(fqName)));
        if (fp == null) {
            Slog.e(TAG, "Unable to get declared service: " + fqName);
            continue;
        }
        try {
            final SensorProps[] props = fp.getSensorProps();
            final FingerprintProvider provider =
                    new FingerprintProvider(getContext(), mBiometricStateCallback, props,
                            instance, mLockoutResetDispatcher,
                            mGestureAvailabilityDispatcher,
                            BiometricContext.getInstance(getContext()));
            mServiceProviders.add(provider);
        } catch (RemoteException e) {
            Slog.e(TAG, "Remote exception in getSensorProps: " + fqName);
        }
    }
}


@Override // Binder call
public void registerAuthenticators(
        @NonNull List<FingerprintSensorPropertiesInternal> hidlSensors) {
    Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL);

    // Some HAL might not be started before the system service and will cause the code below
    // to wait, and some of the operations below might take a significant amount of time to
    // complete (calls to the HALs). To avoid blocking the rest of system server we put
    // this on a background thread.
    final ServiceThread thread = new ServiceThread(TAG, Process.THREAD_PRIORITY_BACKGROUND,
            true /* allowIo */);
    thread.start();
    final Handler handler = new Handler(thread.getLooper());

    handler.post(() -> {
        addHidlProviders(hidlSensors);
        addAidlProviders();

        final IBiometricService biometricService = IBiometricService.Stub.asInterface(
                ServiceManager.getService(Context.BIOMETRIC_SERVICE));

        // Register each sensor individually with BiometricService
        for (ServiceProvider provider : mServiceProviders) {
            final List<FingerprintSensorPropertiesInternal> props =
                    provider.getSensorProperties();
            for (FingerprintSensorPropertiesInternal prop : props) {
                final int sensorId = prop.sensorId;
                final @BiometricManager.Authenticators.Types int strength =
                        Utils.propertyStrengthToAuthenticatorStrength(prop.sensorStrength);
                final FingerprintAuthenticator authenticator = new FingerprintAuthenticator(
                        mServiceWrapper, sensorId);
                try {
                    biometricService.registerAuthenticator(sensorId, TYPE_FINGERPRINT,
                            strength, authenticator);
                } catch (RemoteException e) {
                    Slog.e(TAG, "Remote exception when registering sensorId: " + sensorId);
                }
            }
        }

        synchronized (mLock) {
            for (ServiceProvider provider : mServiceProviders) {
                mSensorProps.addAll(provider.getSensorProperties());
            }
        }

        broadcastCurrentEnrollmentState(null); // broadcasts to all listeners
        broadcastAllAuthenticatorsRegistered();
    });
}

2.2 指纹类型判断

  1. 指纹类型:屏下指纹(TYPE_UDFPS_OPTICAL、TYPE_UDFPS_ULTRASONIC)、侧边指纹(TYPE_POWER_BUTTON
  2. 屏下指纹和侧边指纹判断:isAnyUdfpsTypeisAnySidefpsType
  3. 日志查看:FingerprintProvider.*Added: ID
    frameworks/base/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
    在这里插入图片描述
  • 类型对照

frameworks/base/core/java/android/hardware/fingerprint/FingerprintSensorProperties.java

    /**
     * @hide
     */
    public static final int TYPE_UNKNOWN = 0;

    /**
     * @hide
     */
    public static final int TYPE_REAR = 1;

    /**
     * @hide
     */
    public static final int TYPE_UDFPS_ULTRASONIC = 2;

    /**
     * @hide
     */
    public static final int TYPE_UDFPS_OPTICAL = 3;

    /**
     * @hide
     */
    public static final int TYPE_POWER_BUTTON = 4;

    /**
     * @hide
     */
    public static final int TYPE_HOME_BUTTON = 5;

    /**
     * @hide
     */
    @IntDef({TYPE_UNKNOWN,
            TYPE_REAR,
            TYPE_UDFPS_ULTRASONIC,
            TYPE_UDFPS_OPTICAL,
            TYPE_POWER_BUTTON,
            TYPE_HOME_BUTTON})
    @Retention(RetentionPolicy.SOURCE)
    public @interface SensorType {}
  • 屏下指纹和侧边指纹判断

hardware/interfaces/biometrics/fingerprint/aidl/android/hardware/biometrics/fingerprint/FingerprintSensorType.aidl

package android.hardware.biometrics.fingerprint;

@VintfStability
@Backing(type="byte")
enum FingerprintSensorType {
    UNKNOWN,
    REAR,
    UNDER_DISPLAY_ULTRASONIC,
    UNDER_DISPLAY_OPTICAL,
    POWER_BUTTON,
    HOME_BUTTON
}
    public boolean isAnyUdfpsType() {
        switch (sensorType) {
            case TYPE_UDFPS_OPTICAL:
            case TYPE_UDFPS_ULTRASONIC:
                return true;
            default:
                return false;
        }
    }

    /**
     * Returns if sensor type is side-FPS
     * @return true if sensor is side-fps, false otherwise
     */
    public boolean isAnySidefpsType() {
        switch (sensorType) {
            case TYPE_POWER_BUTTON:
                return true;
            default:
                return false;
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/285151.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PythonStudio=vb7国人写的python可视化窗体设计器IDE,可以替代pyqt designer等设计器了

【免费】PythonStudio-1.1.5-x86最新版国人开发的python界面ide&#xff0c;可以制作窗体资源-CSDN文库https://download.csdn.net/download/xiaoyao961/88688447 【免费】PythonStudio-1.1.5-x64-Setup.exe国人开发的python界面ide&#xff0c;可以制作窗体资源-CSDN文库https…

C# WPF上位机开发(以始为终,寻找真实的上位机需求)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 c# wpf、qt、mfc这些上位机的需求是真实存在的&#xff0c;在现实中有很多应用的地方&#xff0c;这一点大家都很清楚。而程序员本身呢&#xff0c…

Linux:/proc/sys/vm/目录各文件详解

目录 前言一、/proc/sys/vm/目录各文件二、相关功能的API函数 前言 /proc/sys/vm/ 目录是 Linux 系统中的一个特殊目录&#xff0c;它包含了与虚拟内存子系统相关的系统内核参数。这些参数可以用来配置系统的虚拟内存管理策略&#xff0c;包括内存分配、页面置换、内存压缩、NU…

AI提示词入门教程

AI提示词的基本原则与技巧 文章目录 AI提示词的基本原则与技巧前言原则1&#xff1a; 尽可能保证下达的指令“清晰、没有歧义”使用分隔符清楚地指示输入地不同部分要求结构化地输出让模型检查是否满足条件少样本提示 原则2&#xff1a;给AI思考的时间&#xff0c;以及完成任务…

前端八股文(CSS篇)二

目录 1.css中可继承与不可继承属性有哪些 2.link和import的区别 3.transition和animation的区别 4.margin和padding的使用场景 5.&#xff1a;&#xff1a;before和&#xff1a;after的双冒号和单冒号有什么区别&#xff1f; 6.display:inline-block什么时候会显示间隙 7…

在MySQL中使用VARCHAR字段进行日期筛选

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

从仿写持久层框架到MyBatis核心源码阅读

接上篇手写持久层框架&#xff1a;https://blog.csdn.net/liwenyang1992/article/details/134884703 MyBatis源码 MyBatis架构原理&主要组件 MyBatis架构设计 MyBatis架构四层作用是什么呢&#xff1f; API接口层&#xff1a;提供API&#xff0c;增加、删除、修改、查询…

听GPT 讲Rust源代码--library/panic_unwind

File: rust/library/panic_unwind/src/seh.rs 在Rust源代码中&#xff0c;rust/library/panic_unwind/src/seh.rs这个文件的作用是实现Windows操作系统上的SEH&#xff08;Structured Exception Handling&#xff09;异常处理机制。 SEH是Windows上的一种异常处理机制&#xff…

计算机网络【HTTP 灵魂拷问?】

1. HTTP 报文结构是怎样的&#xff1f; 对于 TCP 而言&#xff0c;在传输的时候分为两个部分:TCP头和数据部分。 而 HTTP 类似&#xff0c;也是header body的结构&#xff0c;具体而言: 起始行 头部 空行 实体由于 http 请求报文和响应报文是有一定区别&#xff0c;因此…

FPGA - 240102 - FPGA期末速成

TAG - F P G A 、期末、速成 FPGA、期末、速成 FPGA、期末、速成 // – 习题1 – //CPLD&#xff08;Complex Programmable Logic Device&#xff09;是 Complex PLD 的简称&#xff0c;一种较 PLD 为复杂的逻辑元件。CPLD 逻辑资源多寄存器少&#xff0c;FPGA 逻辑弱而寄存器…

Zookeeper-Zookeeper选举源码

看源码方法&#xff1a; 1、先使用&#xff1a;先看官方文档快速掌握框架的基本使用 2、抓主线&#xff1a;找一个demo入手&#xff0c;顺藤摸瓜快速静态看一遍框架的主线源码&#xff0c;画出源码主流程图&#xff0c;切勿一开始就陷入源码的细枝末节&#xff0c;否则会把自…

Docker:部署若依前后端分离版

Docker&#xff1a;部署若依前后端分离版 1. 停止天翼云上的原来跑的若依项目2. 停止腾讯云上的若依项目3. 使用Docker部署3.1 天翼云数据库&Redis3.1.1 部署数据库3.1.2 部署Redis数据库3.1.1 部署Nginx(这里被天翼云坑了换的腾讯云运行nginx) 3.2 腾讯云部署后端&前端…

C#编程-使用条件构造

使用条件构造 作判定是人的基本能力。判定也是可收编进程序。这有助于确定程序执行指令的顺序。 您可用条件构造来控制程序的流程。条件构造允许您基于被求职的表达式的结果来执行选定语句。 可以包含在C#程序中的各种条件构造是: if…else 构造switch…case 构造if…else构…

多线程学习笔记(二)

1 .如何实现子线程先执行&#xff0c;主线程再执行&#xff1f; 启动子线程后&#xff0c;立即调用该线程的join()方法&#xff0c;则主线程必须等待子线程执行完成后再执行。 ​ 扩展阅读 ​ Thread类提供了让一个线程等待另一个线程完成的方法——join()方法。当在某个程序…

71内网安全-域横向网络传输应用层隧道技术

必备知识点&#xff1b; 代理和隧道技术的区别&#xff1f; 代理主要解决的是网络访问问题&#xff0c;隧道是对过滤的绕过&#xff0c; 隧道技术是为了解决什么 解决被防火墙一些设备&#xff0c;ids&#xff08;入侵检测系统&#xff09;进行拦截的东西进行突破&#xff0…

大华主动注册协议介绍

一、大华主动注册协议介绍 前面写了一篇文章&#xff0c;介绍一些设备通过大华主动注册协议接入到AS-V1000的文章&#xff0c;很多问我关于大华主动注册协议的相关知识。 由于大华主动注册协议是一种私有协议&#xff0c;通常不对外公开详细的协议规范和技术细节。因此…

UDS诊断(ISO14229-1) 27服务

文章目录 功能简介应用场景安全解锁基本原理请求和响应1、请求2、子功能3、肯定响应4、否定响应 注意报文示例UDS中常用 NRC参考 功能简介 27服务&#xff0c;即 SecurityAccess&#xff08;安全访问&#xff09;服务&#xff0c;安全理念采用的是种子与密钥式关系。 应用场景…

VSCode + vite + vue3断点调试配置

没想到这个配置我搞了一上午&#xff0c;网上很多的配置方案都没有效果。总算搞定了&#xff0c;特此记录一下。 首先需要在.vscode文件夹下面创建launch.json配置文件。然后输入如下配置&#xff1a; {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。//…

萨姆·奥尔特曼的预言

Sam Altman&#xff08;萨姆奥尔特曼&#xff09;是 OpenAI 的首席执行官&#xff0c;这家初创公司开发了众所周知的 ChatGPT。2023年11月&#xff0c;他突然被董事会解雇&#xff0c;并短暂调往微软。在 OpenAI 的每个人都威胁要辞职后&#xff0c;他又回来了。 新的商业模式…

OpenCV-13绘制多边形和文本

一、画多边形 使用API polylines绘制多边形。 polylines&#xff08;img&#xff0c; pts&#xff0c; isClose&#xff0c; color&#xff0c; thickness&#xff0c; lineType&#xff0c; shift&#xff09; 其中&#xff1a; pts&#xff1a;表示多边形的点集&#xff…