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