Android Fingerprint完全解析(二) :Fingerprint启动流程
来源:互联网 发布:太阳队布克数据 编辑:程序博客网 时间:2024/06/01 20:22
前言
为了更好地阅读本文,你需要先阅读 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 的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() 方法,如下:
步骤三.访问指纹远程服务(native层的)
进入到1194 行 IFingerprintDaemon daemon = getFingerprintDaemon(),IFingerprintDaemon 从名字可以猜测这个是提供访问远程服务的协议接口。
private static final String FINGERPRINTD = "android.hardware.fingerprint.IFingerprintDaemon";
getFingerprintDaemon() 函数有如下动作:
171行 获取指纹远程Service对象,即FingerprintDaemon的对象(System/core/fingerprintd)
mDaemon = IFingerprintDaemon.Stub.asInterface(ServiceManager.getService(FINGERPRINTD));
175行 初始化远程服务FingerprintDaemon,并且设置回调DaemonCallback
- 176行 调用远程服务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函数,打开指纹Hal 层
- Android Fingerprint完全解析(二) :Fingerprint启动流程
- Android Fingerprint完全解析(二) :Fingerprint启动流程
- Android Fingerprint完全解析(一) :Fingerprint整体框架
- Android Fingerprint完全解析(三) :Fingerprint Hal层分析
- Android Fingerprint完全解析(一) :Fingerprint整体框架
- Android Fingerprint完全解析(三) :Fingerprint Hal层分析
- Android Fingerprint -- Enroll流程
- Android Fingerprint -- Enroll流程
- Android Fingerprint -- Enroll流程
- android M fingerprint 解析
- android SHA1 fingerPrint
- Fingerprint detection
- Android Fingerprint -- HAL层的初始化工作
- android开发中Fingerprint模块浅析
- Android Fingerprint -- HAL层的初始化工作
- android开发中Fingerprint模块浅析
- android开发中Fingerprint模块浅析
- Android Fingerprint -- HAL层的初始化工作
- MAC El Capitan以上版本安装cx_Oracle
- Ext.Ajax.request 中success failure
- 轻量级motan RPC+consul注册服务实现详细DEMO
- 读书笔记:《特劳特营销十要》
- 1YDB后台计划任务无法生成的解决方法
- Android Fingerprint完全解析(二) :Fingerprint启动流程
- AFNetworking 3.0 源码解读(六)之 AFHTTPSessionManager
- 热的不止《我的前半生》还有持续的高温天气和...
- 吐槽一品威客的退款服务
- Opencv中 findContours 函数参数说明
- JS回到顶部按钮实现源代码
- js中的this关键字
- hdoj 1091
- 读取spring的配置来定义常量