一、前言 - 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 系统升级的影响与难度。

二、指纹启动流程分析

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接口的实现类。

[email protected]

service fps_hal /vendor/bin/hw/[email protected]# "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 [email protected] 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 快速开发框架 ThinkAndroid
  2. android GB版本的camera,录像过程中按“菜单”键会停止录像
  3. Android SDK Manager无法下载其他版本SDK和adb无法启动的问题
  4. android studio 使用网络版本的gradle
  5. Android 网络通信框架Volley简介

随机推荐

  1. 注册中心 Eureka 源码解析 —— 调试环境
  2. 分布式事务 TCC-Transaction 源码分析 —
  3. “全新”编程语言 Julia开箱体验
  4. larke-admin通用后台管理系统
  5. 注册中心 Eureka 源码解析 —— Eureka-S
  6. SpringBoot 应用程序启动过程探秘
  7. 网关 Spring-Cloud-Gateway 源码解析 —
  8. 分布式事务 TCC-Transaction 源码解析 —
  9. Springboot应用缓存实践之:Ehcache加持
  10. 注册中心 Eureka 源码解析 —— 应用实例