版权声明:本文为梦想全栈程序猿原创文章,转载请附上原文出处链接和本声明

前面一片文章——Android Fingerprint完全解析(三) :Fingerprint Hal层分析

Android O 指纹识别解析

一、前言 - Project Treble

众所周知,Android 碎片化问题比较严重,新版本更新效率比较低,Google 为了解决此类问题,发布了 Project Treble 项目。Google 在Android O上,修改了框架.

Android O与之前的Android 版本相比,多出了一个vendor.img分区.在此之前的Android 系统架构当中,Android Framework 与Android HAL是打包成一个system.img的,而且Framework 与HAL之间是紧耦合的,通过链接的方式使用相应的硬件相关so库。

老版本的android 的系统框架当中framework与HAL之间的一般架构框架是:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lLhy3vGJ-1639102532477)(https://i.imgur.com/rEjQrBM.png)]

上面的框架结构中,Android framework跟Android HAL耦合度比较高,每次升级framework都需要升级对应的Hal,这个需要OEM厂商花费很大的精力。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C93umMxS-1639102532478)(https://i.imgur.com/N9gcYpv.png)]

Android O及之后的版本的框架:

在Android O以及以后的版本当中,Android 更新了框架,引入了一套叫HIDL的语言来定义Freamework与HAL之间的接口,新的架构如下图

跟之前的版本相比,Android O使用HIDL 来解耦Android Framework 与Vendor HAL Implemetation之间的联系。Framework 跟HAL 会放在不同的分区下面,以往的版本HAL是跟Framework 放到system 分区,会被打包成system.img.而在Android O 上面,HAL是跟Framework 会放到不同的系统分区中,Hal会放到新的分区Vendor分区中,framework 还是在system分区中。这样就简化降低了Android 系统升级的影响与难度。

二、指纹启动流程分析

在看这个之前,可以先看我的另外一篇文章Android Fingerprint完全解析(二) :Fingerprint启动流程,对android O版本之前的指纹流程有一定的了解

1.frameworks\base\services\core\java\com\android\server\fingerprint\FingerprintService.java

 public synchronized IBiometricsFingerprint getFingerprintDaemon() {if (mDaemon == null) {Slog.v(TAG, "mDeamon was null, reconnect to fingerprint");try {mDaemon = IBiometricsFingerprint.getService();} catch (java.util.NoSuchElementException e) {// Service doesn't exist or cannot be opened. Logged below.} catch (RemoteException e) {Slog.e(TAG, "Failed to get biometric interface", e);}if (mDaemon == null) {Slog.w(TAG, "fingerprint HIDL not available");return null;}mDaemon.asBinder().linkToDeath(this, 0);try {mHalDeviceId = mDaemon.setNotify(mDaemonCallback);} catch (RemoteException e) {Slog.e(TAG, "Failed to open fingerprint HAL", e);mDaemon = null; // try again later!}if (DEBUG) Slog.v(TAG, "Fingerprint HAL id: " + mHalDeviceId);if (mHalDeviceId != 0) {loadAuthenticatorIds();updateActiveGroup(ActivityManager.getCurrentUser(), null);doFingerprintCleanup(ActivityManager.getCurrentUser());} else {Slog.w(TAG, "Failed to open Fingerprint HAL!");MetricsLogger.count(mContext, "fingerprintd_openhal_error", 1);mDaemon = null;}}return mDaemon;
}

mDaemon = IBiometricsFingerprint.getService();这句就是获取类似AIDL中的,得到远程服务对象中的本地代码对象。其实这个就是HIDL接口,后边会讲到。我们先看下这个IBiometricsFingerprint 接口是在哪里定义的,看下包名是在hardware 目录下,我们在此目录搜索

import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprintClientCallback;

会看到,代码结构如下图所示。

IBiometricsFingerprint.hal 就是我们上面要找到的接口。当然,这只是一个接口,我们需要找到具体的实现地方。在本目录中看到一个default文件夹。

上面中看到,BiometricsFingerprint.cpp 文件就是IBiometricsFingerprint接口的实现类。

android.hardware.biometrics.fingerprint@2.1-service.rc

service fps_hal /vendor/bin/hw/android.hardware.biometrics.fingerprint@2.1-service
# "class hal" causes a race condition on some devices due to files created
# in /data. As a workaround, postpone startup until later in boot once
# /data is mounted.
class late_start
user system
group system input

上面的rc文件,会启动fps_hal这个service。

#include <android/log.h>
#include <hidl/HidlSupport.h>
#include <hidl/HidlTransportSupport.h>
#include <android/hardware/biometrics/fingerprint/2.1/IBiometricsFingerprint.h>
#include <android/hardware/biometrics/fingerprint/2.1/types.h>
#include "BiometricsFingerprint.h"using android::hardware::biometrics::fingerprint::V2_1::IBiometricsFingerprint;
using android::hardware::biometrics::fingerprint::V2_1::implementation::BiometricsFingerprint;
using android::hardware::configureRpcThreadpool;
using android::hardware::joinRpcThreadpool;
using android::sp;int main() {
android::sp<IBiometricsFingerprint> bio = BiometricsFingerprint::getInstance();configureRpcThreadpool(1, true /*callerWillJoin*/);if (bio != nullptr) {bio->registerAsService();
} else {ALOGE("Can't create instance of BiometricsFingerprint, nullptr");
}joinRpcThreadpool();return 0; // should never get here
}

main函数中会把此service加入到serviceManager中。

BiometricsFingerprint.cpp 文件,会在构造函数中去打开HAL,
其他的地方跟android O 之前的分析就是一样的。

BiometricsFingerprint::BiometricsFingerprint() : mClientCallback(nullptr), mDevice(nullptr) {
sInstance = this; // keep track of the most recent instance
mDevice = openHal();
if (!mDevice) {ALOGE("Can't open HAL module");}
}fingerprint_device_t* BiometricsFingerprint::openHal() {
int err;
const hw_module_t *hw_mdl = nullptr;
ALOGD("Opening fingerprint hal library...");
if (0 != (err = hw_get_module(FINGERPRINT_HARDWARE_MODULE_ID, &hw_mdl))) {ALOGE("Can't open fingerprint HW Module, error: %d", err);return nullptr;
}if (hw_mdl == nullptr) {ALOGE("No valid fingerprint module");return nullptr;
}fingerprint_module_t const *module =reinterpret_cast<const fingerprint_module_t*>(hw_mdl);
if (module->common.methods->open == nullptr) {ALOGE("No valid open method");return nullptr;
}hw_device_t *device = nullptr;if (0 != (err = module->common.methods->open(hw_mdl, nullptr, &device))) {ALOGE("Can't open fingerprint methods, error: %d", err);return nullptr;
}if (kVersion != device->version) {// enforce version on new devices because of HIDL@2.1 translation layerALOGE("Wrong fp version. Expected %d, got %d", kVersion, device->version);return nullptr;
}fingerprint_device_t* fp_device =reinterpret_cast<fingerprint_device_t*>(device);if (0 != (err =fp_device->set_notify(fp_device, BiometricsFingerprint::notify))) {ALOGE("Can't register fingerprint module callback, error: %d", err);return nullptr;
}return fp_device;
}

三、总结

1.android O 去掉了以前版本中的fingerprintd
2.fingerprintSetvice.java 调用HIDL接口,HIDl接口的实现类可以由
指纹厂家自行去实现。

3.其他的没有变化。

Android O指纹识别解析相关推荐

  1. android开发-指纹识别

    在Android 6.0中google终于给Android系统加上了指纹识别的支持,这个功能在iPhone上早就已经实现了,并且在很多厂商的定制的ROM中也都自己内部实现这个功能了,这个功能来的有点晚 ...

  2. Android 实现指纹识别demo

    demo链接:https://download.csdn.net/download/meixi_android/10796468 1.指纹工具类: /*** 作者:created by meixi* ...

  3. Android中指纹识别的使用

    /   今日科技快讯   / 近日,微软斥资75亿美元收购了游戏发行商ZeniMax Media,后者旗下的游戏工作室曾推出<毁灭战士>以及<辐射>等知名游戏.这使得微软旗下的 ...

  4. 简单实现 Android M 指纹识别(附源码)

    众所周知, Android阵营里的指纹兼容真可谓是一团糟, 每个厂家几乎都有一套自己的API, 直到Android M的出现, 才慢慢地走上正途. 那么今天我们就一起来探讨一下, Android M里 ...

  5. Android开发 指纹识别

    1.添加指纹识别权限: <uses-permission android:name="android.permission.USE_FINGERPRINT"/> 2.获 ...

  6. android华为指纹识别开发,华为正在研发“全屏指纹识别+屏下摄像头”共存机型...

    原标题:华为正在研发"全屏指纹识别+屏下摄像头"共存机型 信息显示9月1日中兴将全球首发屏幕下摄像头机型A20 5G,此前业内传言这项技术是华为首发.从现在看来是不可能了,一来中兴 ...

  7. Android随笔-指纹识别

    Android指纹识别在Android 6.0以下是不支持的,Android 6.0使用FingerprintManager进行指纹识别,Android 9.0建议使用BiometricPrompt进 ...

  8. Android使用指纹识别功能

    指纹识别是在Android 6.0以后新增的功能,在使用的时候需要先判断手机的系统版本是否支持指纹识别. AndroidManifest添加权限 <uses-permission android ...

  9. android 指纹框架,Android标准化指纹识别框架(只基于api23官方标准)

    [实例简介] [实例截图] [核心代码] package com.jianyuyouhun.fingerprintscanhelper; import android.support.v7.app.A ...

最新文章

  1. Linux 操作系统原理 — 内存 — Cache 和 Buffer
  2. A. Boredom【DP】
  3. Latex Smartdiagram
  4. bash特性及bash脚本编程初步
  5. java paint调用,求教 如何调用这个paint
  6. element-ui省市区三级联动:选择即改变
  7. java 泛型方法 泛型类
  8. ORACLE中Like与Instr模糊查询性能大比拼
  9. Python中list,tuple,dict,set的区别和用法
  10. ASP.NET Web程序设计 第九章 初识 Web Pages
  11. TypeError: can only concatenate list (not “int“) to list
  12. uva 10098 生成字典续序列
  13. 怎么取消计算机文件共享,Win10系统怎么取消文件共享
  14. 最新阿里巴巴面试官内部题库,2022年Java岗社招必备~
  15. 弯管机编程软件电脑版_奥信编程电脑版
  16. 九阴真经选择服务器无响应,关于64位操作系统闪退问题的解决方案
  17. P1024 [NOIP2001 提高组] 一元三次方程求解
  18. JAVA SE File下面的方法
  19. 《日渐崩坏的世界》赏析(1)
  20. Centos 7安装Squid代理服务及构建传统代理

热门文章

  1. word2013 如何设置从第三页开始编码 或 如何设置封面页和正文页页码不连续
  2. 利用samba共享网络打印机
  3. win7系统提示无法保存打印机设置的解决方法
  4. 分享111个JS菜单导航,总有一款适合您
  5. Win10用户账户被锁定了怎么办?
  6. 如何在markdown中打出上标、下标和一些特殊符号
  7. android平板以太网设置
  8. Lubuntu 截图
  9. java转置123456,怎样将Excel中的行和列互换?
  10. 批量下载以及导出镜像