Android Fingerprint完全解析(二) :Fingerprint启动流程

版权声明:本文为梦想全栈程序猿原创文章,转载请附上原文出处链接和本声明
##前言##
为了更好地阅读本文,你需要先阅读 Android Fingerprint完全解析(一) :Fingerprint整体框架 这篇文章,在此文中,博主分析了Android 6.0 版本TEE 环境下 Fingerprint 的总体框架。阅读本文前,您需要对Android Binder 有一些了解。

##步骤一.启动Fingerprintd##

在init.rc 文件中启动fingerprintd ;这个fingerprintd 是一个可执行文件。

    service fingerprintd /system/bin/fingerprintd
	class late_start
	user root
	group root sdcard_r sdcard_rw

fingerprintd (system/core/fingerprintd 目录)
fingerprintd目录

fingerprintd 的Android.mk 文件

    LOCAL_PATH := $(call my-dir)
	include $(CLEAR_VARS)
	LOCAL_CFLAGS := -Wall -Wextra -Werror -Wunused
	LOCAL_SRC_FILES := \
	FingerprintDaemonProxy.cpp \
	IFingerprintDaemon.cpp \
	IFingerprintDaemonCallback.cpp \
	fingerprintd.cpp
	LOCAL_MODULE := fingerprintd
	LOCAL_SHARED_LIBRARIES := \
	libbinder \
	liblog \
	libhardware \
	libutils \
	libkeystore_binder
	include $(BUILD_EXECUTABLE)

从mk文件中 BUILD_EXECUTABLE 得知,此进程是一个可执行文件。

int main() {

android::sp<android::IServiceManager> serviceManager = android::defaultServiceManager();
android::sp<android::FingerprintDaemonProxy> proxy =
        android::FingerprintDaemonProxy::getInstance();
android::status_t ret = serviceManager->addService(
        android::FingerprintDaemonProxy::descriptor, proxy);
if (ret != android::OK) {
    ALOGE("Couldn't register " LOG_TAG " binder service!");
    return -1;
}

android::IPCThreadState::self()->joinThreadPool();
return 0;

}

启动 native 层的指纹系统服务,调用addService()方法,向serivcemanager 注册server。
这里用到Binder的IPC通信方式,这里可以自行去研究下;
在这里插入图片描述

从FingerprintDaemonProxy.h 这个文件可以看出,根据android Binder的知识,可以知道这个远程服务是FingerprintDaemon。 Fingerprintd 把这个远程服务,注册到serivcemanager,供客户调用,这个远程服务
协议接口是 IFingerprintDaemon,framework 中的FingerprintSerVice 最终会调用这个远程服务,也就是会调用FingerprintDaemonProxy.cpp 里面的方法。

##步骤二.启动FingerprintService##
SystemServer.java

    mSystemServiceManager.startService(FingerprintService.class);

Android系统在加载SystemServer时候,去启动FingerprintService 指纹系统服务 (frameworks/base/services/core/java/com/android/server/fingerprint/FingerprintService.java),
调用FingerprintService 的onStart() 方法,如下:
onStart方法
FingerprintService.java

##步骤三.访问指纹远程服务(native层的)##

进入到上面的onStart方法中的1040 行 IFingerprintDaemon daemon = getFingerprintDaemon(),IFingerprintDaemon 从名字可以猜测这个是提供访问远程服务的协议接口。

    private static final String FINGERPRINTD = "android.hardware.fingerprint.IFingerprintDaemon";

getFingerprintDaemon() 函数有如下动作:

  1. 207行 获取指纹远程Service对象,即FingerprintDaemon的对象(System/core/fingerprintd)

      mDaemon = IFingerprintDaemon.Stub.asInterface(ServiceManager.getService(FINGERPRINTD));
    
  2. 211行 初始化远程服务FingerprintDaemon,并且设置回调DaemonCallback

  3. 212行 调用远程服务FingerprintDaemon 的openHal() 方法。
    在这里插入图片描述
    在这里插入图片描述

总结:

由上可知,framework中的FingerprintService 调用native层的指纹远程服务FingerprintDaemon(跟硬件有关系),可以把FingerprintService 看做指纹远程服务FingerprintDaemon的客户端。

##步骤四.打开Fingerprint Hal层##

步骤三中,

public IFingerprintDaemon getFingerprintDaemon() {
   			 if (mDaemon == null) {
        mDaemon = IFingerprintDaemon.Stub.asInterface(ServiceManager.getService(FINGERPRINTD));
        if (mDaemon != null) {
            try {
                mDaemon.asBinder().linkToDeath(this, 0);
                mDaemon.init(mDaemonCallback);
                mHalDeviceId = mDaemon.openHal();
                if (mHalDeviceId != 0) {
                    updateActiveGroup(ActivityManager.getCurrentUser());
                } else {
                    Slog.w(TAG, "Failed to open Fingerprint HAL!");
                    mDaemon = null;
                }
            } catch (RemoteException e) {
                Slog.e(TAG, "Failed to open fingeprintd HAL", e);
                mDaemon = null; // try again later!
            }
        } else {
            Slog.w(TAG, "fingerprint service not available");
        }
    }
    return mDaemon;
}

getFingerprintDaemon() 方法会调用 mDaemon.init(mDaemonCallback), mDaemon.openHal() ,两个方法,其实就是调用FingerprintDaemonProxy.cpp 的init()函数 跟openHal() 函数。

openHal() 函数中会去打开指纹 HAl层 即,fingerprint.xx.so。

在这里插入图片描述
在这里插入图片描述

总结,整个流程如下:

1.init.rc,启动fingerprintd,并向serivcemanager注册远程服务 FingerprintDaemon

2.系统加载SystemServer ,启动FingerprintService。

3.FingerprintService获取远程服务FingerprintDaemon的对象,调用相关函数

4.FingerprintService调用openHal函数

5.FingerprintDaemonProxy.cpp 执行函数openHal 函数体

便捷访问-Android Fingerprint完全解析(三) :Fingerprint Hal层分析

  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想全栈程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值