OpenHarmony开发者论坛

标题: 无法设置锁屏密码问题的分析报告 [打印本页]

作者: Laval社区小助手    时间: 2024-3-7 14:30
标题: 无法设置锁屏密码问题的分析报告
[md]# 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";
       }
   }
}
```

2. 重新编译时最好删除out目录,不然有缓存编译成功但是改动不生效。
3. 镜像刷好开机,进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.`);
 }
```

2. 根据js代码 `this.userIdentityManager.addCredential(credentialInfo, callback);` 调用,进入napi层 `帐号子系统` 流转到 `统一用户认证框架`。
3. 在 `统一用户认证框架` 模块代码 `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()` 入用户态驱动。
4. 在用户态驱动模块 `user_auth` 代码 `drivers/peripheral/user_auth/hdi_service/service/user_auth_interface_driver.cpp` 中的服务响应接口函数 `UserAuthInterfaceDriverDispatch` 中处理。
5. 继续跟踪到错误日志打印点(drivers/peripheral/user\_auth/hdi\_service/coauth/src/coauth.c)
6. 分析当前代码,可以确认在 `executors` 的 `LinkedList` 中没有符合条件的 executors node导致在创建时报错。
7. 通过回溯调用链,`executors` 是在 `drivers/peripheral/user_auth/hdi_service/coauth/src/pool.c` 中定义的 `g_poolList` 后传入。
8. 通过分析, `pool.c` 文件的作用进行执行器的注册与反注册管理,注册的执行器保存在 `g_poolList` 中。
9. 通过分析执行器注册的代码,发现在 `统一用户认证框架` 模块代码有两处会进入注册:`face_auth` 和 `pin_auth` sa服务。
10. 继续分析 `pin_auth` 模块sa服务启动代码(base/useriam/pin\_auth/services/sa/src/pin\_auth\_service.cpp),在启动时会向 `pin_auth_interface_service` 用户态驱动服务注册。
11. 通过日志分析,`pin_auth` 模块sa服务注册在未找到 `pin_auth_interface_service` 服务,在进入到开发板shell中,用 `ps<span> </span>-ef |<span> </span>grep<span> </span>auth` 查询发现服务确实未起来。
12. 进入 `drivers/peripheral/pin_auth` 仓检查代码正常。
13. 进入HDF框架驱动设备描述配置文件 `vendor/flyhong/fhsmart100/hdf_config/uhdf/device_info.hcs` 检查,发现并未配置 `pin_auth_interface_service` 服务。
14. 配置 `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";
       }
   }
}
```

15. 重启编译,烧录镜像后,验证正常。

# 6 知识分享

1. hdf模块开发流程
   * 定义接口
   * 实现功能代码
   * 向hdf框架注册服务
   * 配置服务启动文件
2. app在使用 `用户认证框架` 功能时,必须要向用户态驱动服务 `user_auth_interface_service` 注册对应的执行器等信息。
[/md]
作者: gaofriend    时间: 2024-3-20 14:58
感谢您的分享。




欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/) Powered by Discuz! X3.5