Android 指纹启动流程

Android 指纹启动流程,第1张

概述前言:之前总结过Android指纹调试流程https://blog.csdn.net/weixin_41486477/article/details/108592205 ,本章主要整理Android指纹启动流程。一.从Android启动流程看指纹启动流程下图图片出处  →第一阶段:BootROM,Android设备上电后,首先会从处理器片上ROM的启动引导代码

前言:之前总结过AndroID指纹调试流程https://blog.csdn.net/weixin_41486477/article/details/108592205 ,本章主要整理AndroID 指纹启动流程。

一.从AndroID启动流程看指纹启动流程

下图图片出处  →

第一阶段:Boot ROM,AndroID设备上电后,首先会从处理器片上ROM的启动引导代码开始执行,片上ROM会寻找Bootloader代码,并加载到内存。

                  主要就是上电让系统启动。

第二阶段:Bootloader开始执行,首先负责完成硬件的初始化,然后找到linux内核代码,并加载到内存。

                  启动过程中,bootloader(默认是bootable/bootloader/lk)会根据机器硬件信息选择合适的devicetree(dts)装入内存,如果采用pin ID兼容,那么在此时就可以通过读取ID pin的值(读寄存器)判断指纹的IC了。

第三阶段:Kernel,linux内核开始启动,初始化各种软硬件环境,加载驱动程序,挂载根文件系统,在系统文件中寻找init.rc文件,并启动init进程。

                  Kernel中,加载指纹驱动,根据传入的dts信息创建设备节点,注册设备。

第四阶段:Init,初始化和启动属性服务,并且启动Zygote进程。

                  找到androID.harDWare.biometrics.fingerprint@2.1-service.rc,启动androID.harDWare.biometrics.fingerprint@2.1-service,会去open  fingerprint.deault.so,等待与上层通信。

第五阶段:Zygote进程启动,创建java虚拟机并为java虚拟机注册JNI方法,创建服务器端Socket,启动SystemServer进程。

第六阶段:SystemServer进程启动,启动Binder线程池和SystemServiceManager,并且启动各种系统服务。

                 会启动Fingerprintservice

 以上是从AndroID启动流程看每个阶段指纹的启动流程 ,下面依次详细展开介绍。

二.驱动层     

主要就是设备节点驱动的注册,在此不再详细说了,重点关注probe函数。

三.hal层

首先,harDWare/interfaces/biometrics/fingerprint/2.1/default/androID.harDWare.biometrics.fingerprint@2.1-service.rc(以下简称2.1 rc)

service vendor.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_start    user system    group system input    writepID /dev/cpuset/system-background/tasks

会使位于系统vendor/bin/hw下的androID.harDWare.biometrics.fingerprint@2.1-service(以下简称2.1 bin)开机自启动,启动后会注册2.1 service

该bin服务对应的代码在:harDWare/interfaces/biometrics/fingerprint/2.1/default/service.cpp,整个注册过程只有两步,首先实例化传入的 IBiometricsFingerprint 接口对象,然后通过 registerasService 将服务注册到 hwservicemanager。

int main() {    androID::sp<IBiometricsFingerprint> bio = BiometricsFingerprint::getInstance();    configureRpcThreadpool(1, true /*callerWillJoin*/);    if (bio != nullptr) {        if (::androID::OK != bio->registerasService()) { //*****注册服务*****            return 1;        }    } else {        ALOGE("Can't create instance of BiometricsFingerprint, nullptr");    }    joinRpcThreadpool();    return 0; // should never get here}

harDWare/interfaces/biometrics/fingerprint/2.1/default/BiometricsFingerprint.cpp,重点关注openHal函数,会去打开fingerprint.default.so

fingerprint_device_t* BiometricsFingerprint::openHal() {    int err;    const hw_module_t *hw_mdl = nullptr;    ALOGD("opening fingerprint hal library...");    //*******打开fingerprint.default.so********    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 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<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;}

关于fingerprint.default.so这个都是供应商提供的,一般都不开源,不过AndroID原生也是有这部分代码的(当然只是看看,并不能使用)

harDWare/libharDWare/include/harDWare/fingerprint.h

harDWare/libharDWare/modules/fingerprint/fingerprint.c

这部分代码不再展开贴在这里了,大家可以自行去看看,主要就是fingerprint_open打开设备(设备节点),然后定义了一系列函数。

    dev->common.tag = HARDWARE_DEVICE_TAG;    dev->common.version = FINGERPRINT_MODulE_API_VERSION_2_0;    dev->common.module = (struct hw_module_t*) module;    dev->common.close = fingerprint_close;    dev->pre_enroll = fingerprint_pre_enroll;    dev->enroll = fingerprint_enroll;    dev->get_authenticator_ID = fingerprint_get_auth_ID;    dev->cancel = fingerprint_cancel;    dev->remove = fingerprint_remove;    dev->set_active_group = fingerprint_set_active_group;    dev->authenticate = fingerprint_authenticate;    dev->set_notify = set_notify_callback;
四.framework层

首先是SystemServer启动后,会去判断设备是否支持指纹,如果有start  FingerprintService

frameworks/base/services/java/com/androID/server/SystemServer.java

        if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {                traceBeginAndSlog("StartFingerprintSensor");                mSystemServiceManager.startService(FingerprintService.class);                traceEnd();            }

此处mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)的判断,大家可以去frameworks/base/core/java/androID/content/pm/PackageManager.java中追代码看看,逻辑很简单。

就是判断系统内vendor/etc/permissions目录下是否有:androID.harDWare.fingerprint.xml 文件

调试的那篇说过这个配置:

PRODUCT_copY_fileS := frameworks/native/data/etc/androID.harDWare.fingerprint.xml:vendor/etc/permissions/androID.harDWare.fingerprint.xml 

 

总结

以上是内存溢出为你收集整理的Android 指纹启动流程全部内容,希望文章能够帮你解决Android 指纹启动流程所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1049439.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存