人脸识别运行时封装与异常白屏修复实施计划

1. 实施目标

一期在不修改 7 个业务页面现有调用方式、不改变人脸识别弹框交互、不改变支付和核验业务的前提下完成内部封装;二期只统一页面弹框创建入口,继续保持原业务监听器、支付和核验逻辑不变。整体改造包括:

2. 实施约束

3. 依赖顺序

回归测试与基线构建
        
FaceRecognitionRuntime
        
LaunchActivity 兼容接入
        
FaceRecognitionSession
        
FaceRecognitionPop 内部替换
        
构建、静态不变量检查、真机回归清单
        
变更记录

4. 任务清单

任务 1:建立模型运行时回归测试

说明:先用 JVM 单元测试定义 Runtime 的单次初始化、并发等待、失败重试、旧回调隔离和页面销毁取消规则。

验收条件:

验证:

./gradlew :app:testDebugUnitTest --tests "com.cpt.cusumption.faceRecognition.runtime.FaceRecognitionRuntimeTest"

预计文件:

依赖:无。

任务 2:实现进程级 FaceRecognitionRuntime

说明:封装现有 InitFaceModelManager,只持有 ApplicationContext,合并并发初始化请求;保留启动页的许可证和失败处理回调。

验收条件:

验证:执行任务 1 的单元测试。

依赖:任务 1。

任务 3:兼容接入 LaunchActivity

说明:只替换 initCustomFaceModel() 中直接创建 InitFaceModelManager 的部分,原许可证状态更新、错误处理、数据库初始化和导航保持原顺序。

验收条件:

预计文件:

依赖:任务 2。

任务 4:建立单次会话保护测试

说明:使用纯 Java 会话门闩测试重复匹配、停止后回调和旧会话回调的过滤规则。

验收条件:

验证:

./gradlew :app:testDebugUnitTest --tests "com.cpt.cusumption.faceRecognition.session.FaceRecognitionSessionGateTest"

预计文件:

依赖:无。

任务 5:实现 FaceRecognitionSession

说明:从弹框抽出 Runtime 就绪等待、相机方向、相机启动停止、倒计时、检测调用、匹配防重复和异步任务释放。

验收条件:

预计文件:

依赖:任务 2、任务 4。

任务 6:兼容式重构 FaceRecognitionPop

说明:保持公开构造方法、监听器和 UI 不变,内部改为创建 Session;删除模型初始化、重复数据库装载、应用重启和直接相机检测代码。

验收条件:

预计文件:

依赖:任务 5。

任务 7:构建和业务不变量检查

说明:执行完整 Debug 单元测试和 APK 构建,并静态检查 7 个页面入口和菜单订单清空逻辑未被改动。

验收条件:

验证:

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

依赖:任务 1 至任务 6。

任务 8:沉淀变更记录

说明:将实际修改文件、关键实现、自动验证结果、真机待验项和剩余风险写入 change_records,生成同名 Markdown 与 HTML。

验收条件:

依赖:任务 7。

5. 检查点

检查点 A:Runtime 完成

检查点 B:Session 与 Pop 完成

检查点 C:自动验证完成

6. 真机回归清单

自动构建不能替代摄像头和双屏真机验证,代码完成后仍需在设备执行:

7. 完成定义

代码落地完成要求:自动测试和 Debug 构建通过、静态业务边界符合设计、变更记录已沉淀。摄像头、双屏和模型故障注入属于真机验收项;未执行前必须明确标记为待验,不能视为已经完成。

8. 执行结果

9. 二期统一入口执行结果