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之间的一般架构框架是:

上面的框架结构中,Android framework跟Android HAL耦合度比较高,每次升级framework都需要升级对应的Hal,这个需要OEM厂商花费很大的精力。

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_startuser systemgroup system input

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

#include #include #include #include #include #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 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 instancemDevice = 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(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 layer    ALOGE("Wrong fp version. Expected %d, got %d", kVersion, device->version);    return nullptr;}fingerprint_device_t* fp_device =    reinterpret_cast(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.其他的没有变化。

更多相关文章

  1. Android外设存储设备的访问及测试
  2. Android(安卓)-Recovery
  3. Android(安卓)ORM 框架之 Android中ORMLite应用基础
  4. 怎样在Eclipse中安装Android的ADT插件
  5. Android安卓应用版本命名规范
  6. Android(安卓)AIDL使用详解
  7. Android(安卓)IPC 机制,进程间通信
  8. 在 Android(安卓)中使用 SQLite, ContentProvider
  9. [译]依赖反转在Android中的实践

随机推荐

  1. Android(安卓)权限大全
  2. Android中关于Bitmap的裁剪缩放和创建
  3. android使用SharedPreferences存储和读取
  4. android 刚进入activity 时关闭输入法
  5. Android(安卓)(DiskLruCache)硬盘缓存代码
  6. LocationManager 的requestLocationUpdat
  7. Android Wi-Fi 修改国家码(QCOM平台)
  8. h5在线动态页面调用app原生方法
  9. Android 小代码集
  10. android9.0 关闭launcher界面的搜索框