无法设置锁屏密码问题的分析报告
1 关键字 锁屏密码;useriam用户认证框架;hdf用户态驱动 2 问题描述 环境: OpenHarmony版本号:3.2.9.2 beta4 问题现象:打开设置,进入生物识别和密码-->锁屏密码,进入到设置锁屏密码界面,输入2次密码,确认后提示创建错误。 3 问题原因 3.1 正常机制 设置成功后打印日志: 01-01 08:03:09.894 1790 1790 I A00500/[Set
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
未适配启动导致。 适配配置方法:
-
在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"; } } }
-
重新编译时最好删除out目录,不然有缓存编译成功但是改动不生效。
-
镜像刷好开机,进shell后:ps -ef | grep auth查看,用户态驱动服务 user_auth_host, pin_auth_host 以及 sa 服务 pinauth 都起来即正常。
5 定位过程
-
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.`);
}
-
根据js代码
this.userIdentityManager.addCredential(credentialInfo, callback);
调用,进入napi层帐号子系统
流转到统一用户认证框架
。 -
在
统一用户认证框架
模块代码base/useriam/user_auth_framework/services/ipc/src/user_idm_service.cpp
中的AddCredential函数中,先通过auto context = ContextFactory::CreateEnrollContext(para, contextCallback);
获取hdi实例创建context,调用context->Start()
入用户态驱动。 -
在用户态驱动模块
user_auth
代码drivers/peripheral/user_auth/hdi_service/service/user_auth_interface_driver.cpp
中的服务响应接口函数UserAuthInterfaceDriverDispatch
中处理。 -
继续跟踪到错误日志打印点(drivers/peripheral/user_auth/hdi_service/coauth/src/coauth.c)
-
分析当前代码,可以确认在
executors
的LinkedList
中没有符合条件的 executors node导致在创建时报错。 -
通过回溯调用链,
executors
是在drivers/peripheral/user_auth/hdi_service/coauth/src/pool.c
中定义的g_poolList
后传入。 -
通过分析,
pool.c
文件的作用进行执行器的注册与反注册管理,注册的执行器保存在g_poolList
中。 -
通过分析执行器注册的代码,发现在
统一用户认证框架
模块代码有两处会进入注册:face_auth
和pin_auth
sa服务。 -
继续分析
pin_auth
模块sa服务启动代码(base/useriam/pin_auth/services/sa/src/pin_auth_service.cpp),在启动时会向pin_auth_interface_service
用户态驱动服务注册。
-
通过日志分析,
pin_auth
模块sa服务注册在未找到pin_auth_interface_service
服务,在进入到开发板shell中,用ps -ef | grep auth
查询发现服务确实未起来。 -
进入
drivers/peripheral/pin_auth
仓检查代码正常。 -
进入HDF框架驱动设备描述配置文件
vendor/flyhong/fhsmart100/hdf_config/uhdf/device_info.hcs
检查,发现并未配置pin_auth_interface_service
服务。 -
配置
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"; } } }
-
重启编译,烧录镜像后,验证正常。
6 知识分享
-
hdf模块开发流程
-
定义接口
-
实现功能代码
-
向hdf框架注册服务
-
配置服务启动文件
-
-
app在使用
用户认证框架
功能时,必须要向用户态驱动服务user_auth_interface_service
注册对应的执行器等信息。
更多推荐
所有评论(0)