启动页离线人脸与生命周期第三批修复记录
问题与范围
前两批已解决无网弹框阻断触摸、同步误判、重复人脸请求、客屏悬浮窗权限和基础网络生命周期问题。本批收口已初始化设备离线启动时跳过人脸运行时、人脸初始化失败与网络同步失败混用、SDK 异步回调持有旧页面、数据库加载线程无法单独取消,以及启动页未知设备弹框恢复后业务回调丢失的问题。
范围限定在启动页及其直接依赖的人脸激活、模型、数据库加载和提示弹框恢复链路,不调整订单、支付协议和服务端接口。
代码改动
StartupFaceInitializationPolicy.java:区分关闭人脸、在线激活后加载、离线直接加载本地运行时三种动作。StartupRetryPolicy.java:区分远程同步、离线重试本地运行时和首次初始化等待网络。LaunchActivity.java:离线启动先完成人脸运行时;按自定义模型、注册模型、数据库和内存索引顺序初始化;人脸失败返回可触摸恢复区;页面销毁释放全部启动任务;未知设备弹框使用可恢复宿主回调。ActivationFaceSDK.java:返回可取消回调句柄并使用 Application Context。InitFaceModelManager.java:支持释放回调,已初始化状态也返回成功。InitFaceDBApiManager.java:持有并关闭执行器;提供不清空全局数据的生命周期取消;释放后不再写数据或回调页面。FaceSDKManager.java:人脸搜索模型为空时安全跳过内存推送。NewSingleTipPop.java:保存请求标识和按钮状态,由重建后的 Activity 接管启动页业务动作。- 新增并扩展离线人脸启动与重试策略单元测试。
修复后的启动行为
- 首次初始化无网:停留在可触摸启动页,提供重新同步和设置入口。
- 已初始化且无网、人脸关闭:使用本地业务数据进入首页。
- 已初始化且无网、人脸开启:不联网,加载本地模型、人脸库和内存索引后进入首页。
- 本地人脸初始化失败:返回可触摸恢复区,离线重试不会形成失败循环。
- 启动页退出后,网络、批处理、激活、模型、数据库和延迟跳转不再推进旧页面。
验证
- TDD 红灯确认双参数人脸策略和重试策略缺失;实现后目标测试转绿。
- 使用 JDK 8 强制执行
JAVA_HOME=$(/usr/libexec/java_home -v 1.8) bash gradlew :app:testDebugUnitTest :app:assembleDebug --rerun-tasks --console=plain,结果为BUILD SUCCESSFUL,92 个任务执行完成。 - 单元测试共 20 个,失败 0、错误 0、跳过 0。
- Debug APK 已生成。
验收边界
- 代码级启动问题已收口;离线授权、摄像头、人脸识别和双屏显示仍需米果三合一真机验收。
- 构建仍输出旧版人脸依赖的 D8 stack-map 警告,但构建成功,该警告不是本批引入。
- 本次未执行 Git 暂存、提交或推送。