1. 驱动实现原理

1.1 整体架构设计

OpenHarmony人脸识别驱动采用分层架构设计,基于HDF(Hardware Driver Foundation)框架实现,主要包括以下层次:

  • 接口层(IDL定义):定义标准化的HDI接口,提供跨进程通信能力
  • 服务层(Service实现):实现具体的业务逻辑,处理人脸识别相关操作
  • 执行器层(Executor实现):封装具体的人脸识别算法和硬件操作

1.2 核心组件

1.2.1 接口定义组件
  • IFaceAuthInterface:人脸认证接口,负责获取执行器列表
  • IAllInOneExecutor:一体化执行器接口,处理所有认证操作
  • IExecutorCallback:异步操作回调接口,用于结果和状态通知
1.2.2 服务实现组件
  • FaceAuthInterfaceService:人脸认证接口服务实现
  • AllInOneExecutorImpl:一体化执行器实现

1.3 工作流程

  1. 初始化阶段:驱动加载时创建FaceAuthInterfaceService实例
  2. 执行器注册:服务创建AllInOneExecutorImpl实例并注册到执行器列表
  3. 业务操作:上层应用通过HDI接口调用执行器的具体功能
  4. 异步回调:通过IExecutorCallback接口返回操作结果
Hardware
Driver Kernel Space
HDI Layer
User Space
BiometricPrompt
FaceAuthService
GetExecutorList
IPC-HDF
new
ioctl
调用
TA 调用
加密读写
MIPI
OpenCL/NNAPI
RPMB
RGB Camera
IR Camera
Dot Projector
TPU/NPU
卷积加速
Secure Element
防回滚
FaceAuthInterfaceService
服务层
AllInOneExecutorImpl
执行器层
Face Algorithm
TA/CA
Camera ISP
MIPI-CSI
TEE/Secure OS
TrustZone
Face Template
安全存储
HDI FaceAuth
IDL接口
FaceAuthManager
系统服务
BiometricPrompt
应用框架
App: 支付宝/微信
人脸支付

2. 驱动接口调用关系

异步通信机制
驱动接口调用关系
GetExecutorList
返回执行器列表
Enroll/Authenticate/Identify
OnResult/OnTip
回调通知
消息发送
上层应用
FaceAuthInterfaceService
IFaceAuthInterface
IAllInOneExecutor
AllInOneExecutorImpl
IExecutorCallback
硬件设备

2.1 接口调用时序

上层应用 IFaceAuthInterface FaceAuthInterfaceService AllInOneExecutorImpl IExecutorCallback GetExecutorList() GetExecutorList() 创建执行器实例 返回执行器列表 返回执行器列表 Enroll(scheduleId, extraInfo, callback) 处理注册逻辑 OnResult(result, extraInfo) 返回注册结果 Authenticate(scheduleId, templateIdList, extraInfo, callback) 处理认证逻辑 OnTip(tip, extraInfo) 返回认证状态 OnResult(result, extraInfo) 返回认证结果 上层应用 IFaceAuthInterface FaceAuthInterfaceService AllInOneExecutorImpl IExecutorCallback

3. 实现函数源码解读

3.1 FaceAuthInterfaceService 实现

3.1.1 构造函数
FaceAuthInterfaceService::FaceAuthInterfaceService()
{
    auto executor = new (std::nothrow) AllInOneExecutorImpl();
    if (executor == nullptr) {
        IAM_LOGE("executor is nullptr");
        return;
    }
    executorList_.push_back(sptr<IAllInOneExecutor>(executor));
}

功能说明

  • 创建AllInOneExecutorImpl实例
  • 将执行器添加到执行器列表中
  • 提供错误处理机制
3.1.2 GetExecutorList方法
int32_t FaceAuthInterfaceService::GetExecutorList(std::vector<sptr<IAllInOneExecutor>> &executorList)
{
    IAM_LOGI("interface mock start");
    for (auto executor : executorList_) {
        executorList.push_back(executor);
    }
    IAM_LOGI("interface mock success");
    return HDF_SUCCESS;
}

功能说明

  • 遍历内部执行器列表
  • 将执行器引用添加到输出参数中
  • 返回操作成功状态

3.2 AllInOneExecutorImpl 实现

3.2.1 构造函数
AllInOneExecutorImpl::AllInOneExecutorImpl()
{
    executorInfo_ = {
        .sensorId = SENSOR_ID,
        .executorMatcher = EXECUTOR_TYPE,
        .executorRole = ExecutorRole::ALL_IN_ONE,
        .authType = AuthType::FACE,
        .publicKey = std::vector<uint8_t>(PUBLIC_KEY_LEN, 0),
        .extraInfo = {},
        .esl = ExecutorSecureLevel::ESL2,
        .maxTemplateAcl = FACE_CAPABILITY_LEVEL,
    };
}

功能说明

  • 初始化执行器信息结构体
  • 设置传感器ID、执行器类型、认证类型等参数
  • 配置安全等级和能力级别
3.2.2 Enroll方法
int32_t AllInOneExecutorImpl::Enroll(uint64_t scheduleId, const std::vector<uint8_t> &extraInfo, 
                                     const sptr<IExecutorCallback> &callbackObj)
{
    IAM_LOGI("interface mock start");
    static_cast<void>(scheduleId);
    static_cast<void>(extraInfo);
    if (callbackObj == nullptr) {
        IAM_LOGE("callbackObj is nullptr");
        return HDF_ERR_INVALID_PARAM;
    }
    IAM_LOGI("enroll, result is %{public}d", ResultCode::OPERATION_NOT_SUPPORT);
    int32_t ret = callbackObj->OnResult(ResultCode::OPERATION_NOT_SUPPORT, {});
    if (ret != HDF_SUCCESS) {
        IAM_LOGE("callback result is %{public}d", ret);
        return HDF_FAILURE;
    }
    return HDF_SUCCESS;
}

功能说明

  • 处理人脸注册请求
  • 验证回调对象有效性
  • 通过回调返回操作结果
  • 提供完整的错误处理机制
3.2.3 Authenticate方法
int32_t AllInOneExecutorImpl::Authenticate(uint64_t scheduleId, const std::vector<uint64_t> &templateIdList,
    const std::vector<uint8_t> &extraInfo, const sptr<IExecutorCallback> &callbackObj)
{
    IAM_LOGI("interface mock start");
    static_cast<void>(scheduleId);
    static_cast<void>(templateIdList);
    static_cast<void>(extraInfo);
    if (callbackObj == nullptr) {
        IAM_LOGE("callbackObj is nullptr");
        return HDF_ERR_INVALID_PARAM;
    }
    IAM_LOGI("authenticate, result is %{public}d", ResultCode::NOT_ENROLLED);
    int32_t ret = callbackObj->OnResult(ResultCode::NOT_ENROLLED, {});
    if (ret != HDF_SUCCESS) {
        IAM_LOGE("callback result is %{public}d", ret);
        return HDF_FAILURE;
    }
    return HDF_SUCCESS;
}

功能说明

  • 处理人脸认证请求
  • 支持模板列表认证
  • 返回认证状态和结果
3.2.4 SendCommand方法
int32_t AllInOneExecutorImpl::SendCommand(int32_t commandId, const std::vector<uint8_t> &extraInfo, 
                                          const sptr<IExecutorCallback> &callbackObj)
{
    IAM_LOGI("interface mock start");
    static_cast<void>(extraInfo);
    if (callbackObj == nullptr) {
        IAM_LOGE("callbackObj is nullptr");
        return HDF_ERR_INVALID_PARAM;
    }
    int32_t ret;
    switch (commandId) {
        case DriverCommandId::LOCK_TEMPLATE:
            IAM_LOGI("lock template, result is %{public}d", ResultCode::SUCCESS);
            ret = callbackObj->OnResult(ResultCode::SUCCESS, {});
            break;
        case DriverCommandId::UNLOCK_TEMPLATE:
            IAM_LOGI("unlock template, result is %{public}d", ResultCode::SUCCESS);
            ret = callbackObj->OnResult(ResultCode::SUCCESS, {});
            break;
        case DriverCommandId::INIT_ALGORITHM:
            IAM_LOGI("init algorithm, result is %{public}d", ResultCode::SUCCESS);
            ret = callbackObj->OnResult(ResultCode::SUCCESS, {});
            break;
        default:
            IAM_LOGD("not support DriverCommandId : %{public}d", commandId);
            ret = callbackObj->OnResult(ResultCode::OPERATION_NOT_SUPPORT, {});
    }
    if (ret != HDF_SUCCESS) {
        IAM_LOGE("callback result is %{public}d", ret);
        return HDF_FAILURE;
    }
    return HDF_SUCCESS;
}

功能说明

  • 支持多种驱动命令操作
  • 包括模板锁定、解锁、算法初始化等
  • 提供命令扩展机制

4. 驱动接口版本差异说明

4.1 v1.0 版本特性

4.1.1 接口定义
  • IExecutor接口:基础执行器接口
  • IFaceAuthInterface接口:基础人脸认证接口
  • IExecutorCallback接口:基础回调接口
4.1.2 主要功能
  • 基本的注册、认证、识别、删除操作
  • 简单的命令发送机制
  • 基础的回调通知

4.2 v1.1 版本增强

4.2.1 新增功能
  • 属性获取机制:支持获取认证子类型、锁定时长等属性
  • 模板缓存:支持模板缓存功能
  • SA命令回调:新增系统应用命令回调机制
4.2.2 接口扩展
// v1.1 新增方法
int32_t GetProperty(const std::vector<uint64_t> &templateIdList, 
                   const std::vector<int32_t> &propertyTypes, Property &property);
                    
int32_t SetCachedTemplates(const std::vector<uint64_t> &templateIdList);

int32_t RegisterSaCommandCallback(const sptr<ISaCommandCallback> &callbackObj);

4.3 v2.0 版本全面升级

4.3.1 架构重构
  • 一体化执行器:将Collector和Verifier功能合并
  • 增强的安全机制:支持更高级别的安全等级
  • 扩展的消息机制:支持角色间消息传递
4.3.2 新增特性
  • 消息发送机制:支持执行器间消息通信
  • 增强的命令支持:扩展驱动命令类型
  • 完善的回调机制:新增OnMessage回调
4.3.3 接口对比
特性 v1.0 v1.1 v2.0
执行器类型 基础执行器 基础执行器 一体化执行器
属性管理 不支持 支持 支持
模板缓存 不支持 支持 支持
消息机制 不支持 不支持 支持
SA命令回调 不支持 支持 支持
安全等级 ESL0-ESL3 ESL0-ESL3 增强安全机制

4.4 版本演进总结

  1. v1.0 → v1.1:功能增强,增加属性管理和模板缓存
  2. v1.1 → v2.0:架构重构,实现一体化执行器设计
  3. 兼容性保证:新版本保持向后兼容,支持平滑升级

5. 关键技术特性

5.1 异步回调机制

  • 支持操作结果的异步通知
  • 提供处理过程中的状态提示
  • 确保UI线程不被阻塞

5.2 安全机制

  • 多级安全等级支持(ESL0-ESL3)
  • 模板访问控制
  • 公钥加密通信

5.3 扩展性设计

  • 模块化的接口设计
  • 支持自定义命令扩展
  • 可插拔的执行器架构

OpenHarmony人脸识别驱动通过分层架构设计和标准化的HDI接口,提供了完整的人脸识别功能支持。从v1.0到v2.0的版本演进体现了系统在功能丰富性、安全性和扩展性方面的持续改进。驱动采用异步回调机制确保系统响应性,同时通过模块化设计支持灵活的扩展和定制。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐