人脸识别初始化请求兼容性修复变更记录

变更日期:2026-09-02 | 分支:fix_baidu_init | 基线:846f99b
状态:自动验证完成,真机待验

1. 发生原因

旧 Runtime 没有区分启动页的正式初始化请求与业务 Session 的等待请求。ensureReady(...) 能在未初始化状态创建不带在线许可证的模型任务;启动页随后只能加入该任务,自己的许可证参数没有生效,并继承了前一个任务已经消耗的超时时间。日志中的 -10001 是应用层 45 秒模型超时,不是厂商 SDK 原始错误码。

2. 初始化注意点

3. 如何初始化

  1. 启动页取得许可证后调用 FaceRecognitionRuntime.initialize(context, license, callback)
  2. Runtime 创建唯一启动代次,并调用带许可证的在线初始化。
  3. 先启动 15 秒授权计时;授权成功后取消该计时。
  4. 从模型实际加载时重新启动完整的 45 秒模型计时。
  5. 成功进入 READY 并通知等待者;失败进入 FAILED 并保存原错误。
  6. 业务只调用 ensureReady(...):已就绪立即继续、初始化中加入等待、尚未启动返回 -10003、失败返回上次真实错误。

4. 源码变更

FaceRecognitionRuntime

InitFaceModelManager

回归测试

覆盖业务请求不抢初始化、启动页使用自己的许可证、共享启动任务、取消等待互不影响,以及失败后返回原错误且不偷偷重试。本次未修改启动页、Session、弹框、支付核销页面及原业务回调。

5. TDD 与自动验证

新增测试先在旧实现上失败,证明 ensureReady(...) 会错误启动模型;完成职责分离后转为通过。失败信息保留功能同样经历先失败再通过。

JAVA_HOME=/Users/liang/Library/Java/JavaVirtualMachines/corretto-1.8.0_482/Contents/Home \
sh ./gradlew :app:testDebugUnitTest :app:assembleDebug

构建仅保留项目既存的 flatDir、Build Tools、SDK namespace 和第三方 YNHAPI 字节码版本警告,本次没有新增编译失败。

6. 真机待验

7. Git 状态

未执行暂存、提交、推送,也未创建或切换分支。