积分582 / 贡献0

提问0答案被采纳0文章52

[经验分享] 无法设置锁屏密码问题的分析报告 原创

Laval社区小助手 显示全部楼层 发表于 2024-3-7 14:30:47

1 关键字

锁屏密码;useriam用户认证框架;hdf用户态驱动

2 问题描述

环境: OpenHarmony版本号:3.2.9.2 beta4 问题现象:打开设置,进入生物识别和密码-->锁屏密码,进入到设置锁屏密码界面,输入2次密码,确认后提示创建错误。

3 问题原因

3.1 正常机制

设置成功后打印日志:

01-01 08:03:09.894  1790  1790 I A00500/[Settings]: Settings PasswordModel# Add pin credential, result: 0
01-01 08:03:09.894  1790  1790 I A00500/[Settings]: Settings PasswordInputController create password success

3.2 异常机制

设置报错后打印日志:

01-01 08:05:45.045  1838  1838 I A00500/[Settings]: Settings PasswordModel# Add pin credential, result: 12300001
01-01 08:05:45.045  1838  1838 I A00500/[Settings]: Settings PasswordInputController create password failed

4 解决方案

当前问题产生的原因是用户态驱动服务 pin_auth_interface_service 未适配启动导致。 适配配置方法:

  1. 在vendor/XXXX/hdf_config/uhdf/device_info.hcs文件添加如下代码,与其它节点并列即可:
pin_auth :: host {
    hostName = "pin_auth_host";
    priority = 50;
    uid = "useriam";
    gid = ["useriam"];
    pin_auth_device :: device {
        device0 :: deviceNode {
            policy = 2;
            priority = 200;
            preload = 0;
            moduleName = "libpin_auth_driver.z.so";
            serviceName = "pin_auth_interface_service";
        }
    }
}
  1. 重新编译时最好删除out目录,不然有缓存编译成功但是改动不生效。
  2. 镜像刷好开机,进shell后:ps -ef | grep auth查看,用户态驱动服务 user_auth_host, pin_auth_host 以及 sa 服务 pinauth 都起来即正常。

5 定位过程

  1. app调用代码
  addPinCredential(pinSubType: number, password: string, onResultCall: (result: number) => void): void {
    LogUtil.debug(`${this.TAG}addPinCredential in.`);
    try {
      this.pinSubType = pinSubType;
      this.password = password;
      let token = new Uint8Array([]);
      let credentialInfo = {
        credType: AuthType.PIN, credSubType: pinSubType, token: token
      }
      let callback = {
        onResult: (result, extraInfo) => {
          LogUtil.info(`${this.TAG} Add pin credential, result: ${result}`);
          onResultCall(result);
        }
      };
      this.userIdentityManager.addCredential(credentialInfo, callback);
    } catch (e) {
      LogUtil.debug(`${this.TAG}addPinCredential failed:` + e);
    }
    LogUtil.debug(`${this.TAG}addPinCredential out.`);
  }
  1. 根据js代码 this.userIdentityManager.addCredential(credentialInfo, callback); 调用,进入napi层 帐号子系统 流转到 统一用户认证框架
  2. 统一用户认证框架 模块代码 base/useriam/user_auth_framework/services/ipc/src/user_idm_service.cpp 中的AddCredential函数中,先通过 auto context<span> </span>= ContextFactory::CreateEnrollContext(para, contextCallback); 获取hdi实例创建context,调用 context->Start() 入用户态驱动。
  3. 在用户态驱动模块 user_auth 代码 drivers/peripheral/user_auth/hdi_service/service/user_auth_interface_driver.cpp 中的服务响应接口函数 UserAuthInterfaceDriverDispatch 中处理。
  4. 继续跟踪到错误日志打印点(drivers/peripheral/user_auth/hdi_service/coauth/src/coauth.c)
  5. 分析当前代码,可以确认在 executorsLinkedList 中没有符合条件的 executors node导致在创建时报错。
  6. 通过回溯调用链,executors 是在 drivers/peripheral/user_auth/hdi_service/coauth/src/pool.c 中定义的 g_poolList 后传入。
  7. 通过分析, pool.c 文件的作用进行执行器的注册与反注册管理,注册的执行器保存在 g_poolList 中。
  8. 通过分析执行器注册的代码,发现在 统一用户认证框架 模块代码有两处会进入注册:face_authpin_auth sa服务。
  9. 继续分析 pin_auth 模块sa服务启动代码(base/useriam/pin_auth/services/sa/src/pin_auth_service.cpp),在启动时会向 pin_auth_interface_service 用户态驱动服务注册。
  10. 通过日志分析,pin_auth 模块sa服务注册在未找到 pin_auth_interface_service 服务,在进入到开发板shell中,用 ps<span> </span>-ef |<span> </span>grep<span> </span>auth 查询发现服务确实未起来。
  11. 进入 drivers/peripheral/pin_auth 仓检查代码正常。
  12. 进入HDF框架驱动设备描述配置文件 vendor/flyhong/fhsmart100/hdf_config/uhdf/device_info.hcs 检查,发现并未配置 pin_auth_interface_service 服务。
  13. 配置 pin_auth_interface_service 服务,在文件中添加信息:
pin_auth :: host {
    hostName = "pin_auth_host";
    priority = 50;
    uid = "useriam";
    gid = ["useriam"];
    pin_auth_device :: device {
        device0 :: deviceNode {
            policy = 2;
            priority = 200;
            preload = 0;
            moduleName = "libpin_auth_driver.z.so";
            serviceName = "pin_auth_interface_service";
        }
    }
}
  1. 重启编译,烧录镜像后,验证正常。

6 知识分享

  1. hdf模块开发流程
    • 定义接口
    • 实现功能代码
    • 向hdf框架注册服务
    • 配置服务启动文件
  2. app在使用 用户认证框架 功能时,必须要向用户态驱动服务 user_auth_interface_service 注册对应的执行器等信息。

©著作权归作者所有,转载或内容合作请联系作者

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

精彩评论1

gaofriend

沙发 发表于 2024-3-20 14:58:08
感谢您的分享。

Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部