1. 程式人生 > >Android O 指紋識別解析

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 系統升級的影響與難度。

新的升級框架

二、指紋啟動流程分析

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資料夾。 
biometrics 
實現

上面中看到,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_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 [email protected] translation layer
    ALOGE("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 指紋識別解析

一、前言 - Project Treble眾所周知,Android 碎片化問題比較嚴重,新版本更新效率比較低,Google 為了解決此類問題,釋出了 Project Treble 專案。Google 在Android O上,修改了框架.Android O與之前的Android

Android N指紋識別

第一部分 指紋模組流程分析 一、Fingerprint模組架構 Fingerprint模組架構圖如下,這裡分為application,framework,fingerprintd和FingerprintHal這幾個部分,不涉及指紋的IC庫和驅動這部分,這部分邏輯由指紋

android指紋識別、拼圖遊戲、仿MIUI長截屏、bilibili最美創意等源碼

jpg 自己的 管家 掃碼 信息 圓盤 post server htm Android精選源碼 一個動畫效果的播放控件,播放,暫停,停止之間的動畫 用 RxJava 實現 Android 指紋識別代碼 Android仿滴滴打車(滴滴UI)源碼 Android高仿嗶哩嗶

Android O PackageInstaller 解析

獲取 androi -c logger count nba inf ber cts Android O 8.0 1.src\com\android\packageinstaller\permission\mode\PermissionGroups.java

Android 6.0 指紋識別功能學習(一)----阿冬專欄!!!

轉載自:http://www.cnblogs.com/changyuet/p/5535082.html     由於畢設需要設計增強的身份認證(生物特徵認證方式),所以需要學習指紋識別相關的android6.0功能,進而設計自己的畢設:支援媒體可信通訊的andro

Android指紋識別API講解,一種更快更好的使用者體驗

 我發現了一個比較怪的現象。在iPhone上使用十分普遍的指紋認證功能,在Android手機上卻鮮有APP使用,我簡單觀察了一下,發現Android手機上基本上只有支付寶、微信和極少APP支援指紋認證功能,就連銀行和金融類的應用都基本不支援,甚至很多開發者都不知道Androi

利用Android-FingerprintManager類實現指紋識別

安卓指紋識別 利用FingerprintManager主類進行指紋識別。 在安卓6.0中新增了API,FingerprintManager類,它是Google提供的幫助訪問指紋硬體的API類 新增API許可權的過程如下 ContextCompact.checkSelfPermission //

android指紋識別認證實現

erp ica signal except mpat too adding return parent Android從6.0系統支持指紋認證功能 啟動頁面簡單實現 package com.loaderman.samplecollect.zhiwen; imp

Android 6.0指紋識別App開發demo

本文章轉載自 : http://blog.csdn.net/baniel01/article/details/51991764 不詳細的地方,請檢視原文 在Android 6.0中google終於給android系統加上了指紋識別的支援,這個功能在iPhone上早就已經實現了,並且在很多廠商的定製的ROM

Android 指紋識別

1. Android 6.0指紋驗證 1). 獲取指紋管理者 /** * 指紋管理者 */ private var mFingerprintManager: FingerprintManager? = null /** * 獲取指紋管理者

Android 指紋識別加解密

主要用到的是FingerprintManager這個類,此類是訪問指紋硬體的便捷類,通過Context#getSystemService(Context.FINGERPRINT_SERVICE)獲取相應的單例。應用場景:在指紋加密模組中對一個具有某種特定功能的資料(比如密碼等

android指紋識別開發

android6.0之後google對指紋識別進行了官方支援。 相關類介紹 1.FingerprintManager:主要用來協調管理和訪問指紋識別硬體裝置 2.FingerprintManager.AuthenticationCallback這個一個c

電容式 指紋識別 android 智慧硬體

目前,各個手機中,都是用的電容式指紋識別模組 公司打卡機,大都是光學指紋模組,相對上者便宜一些; 1.現在陳列一些資料; 基於stm32和fpc1011c2的指紋採集系統 指紋識別的模組,現在主流的是,fpc1011或者1020,好多廠家,為了保

Android中的指紋識別

評論中很多朋友反映,根據我給出的方案,拿不到指紋資訊這個問題,在這裡統一說明一下。 首先,這篇文章中涉及到的程式碼,我在一部魅族手機和一部三星手機上進行測試過,能獲取到資訊。其他手機機型我沒有測試,不知道詳細情況。 其次,我在部落格

Android指紋識別

  最近開始做專案的時候,需要用到Android中的指紋識別,剛開始實在是有點懵逼,主要是別人給的意見讓我把思路給堵住了,現在回過頭來看看,其實也是意見很簡單的事,不過最開始是因為Android6.0才剛出來沒多久,對於指紋識別沒有過多的介紹。也有哥們問過我通過

Android下的指紋識別及登陸

一、概述 Android下的指紋識別是在Android6.0後新增的功能,因此,在實現的時候要判斷使用者機是否支援,然後對於開發來說,使用場景有兩種,分別是本地識別和跟伺服器互動; 1.本地識別:在本地完成指紋的識別後,跟本地資訊繫結登陸;

system和vendor分割槽掛載解析Android O

首先我們知道init程序在執行時會呼叫自身,所以init程序分為stage1和stage2兩個階段,而分割槽掛載操作也分為兩個階段: stage1掛載操作是利用device tree中的配置項來讀取配置掛載的;stage2掛載操作則是我們常見的利用fstab配

Android-指紋識別技術(含原始碼)

今天介紹新增指紋識別技術的幾個步驟;;1.首先新增許可權<uses-permission android:name="android.permission.USE_FINGERPRINT"/>2.設計你的開鎖介面,由於不是正式專案,我就撈一次3.獲取移動裝置指紋管

Android屬性動畫完全解析(上),初識屬性動畫的基本用法

fcm 操作 fad 擴展性 改變 內部使用 如果 轉載 @override 轉載請註明出處:http://blog.csdn.net/guolin_blog/article/details/43536355 在手機上去實現一些動畫效果算是件比較炫酷的事情,因此Andr

基於android的語音識別

wifi listview appid stat perm state c語音 utility extend 1.註冊賬戶,添加應用 2.針對android平臺的選擇應用,下載SDK 3.將SDK的libs下文件拷貝到工程的libs目錄下 4.添加用戶權限