上述代码问题已分三批完成修复。最终启动流程能够区分首次初始化和已初始化设备,网络失败时不再以模态弹框锁死页面;人员、人脸及客屏任务具备明确的成功、失败、降级和释放路径。
当前没有已知的启动页代码遗留。由于本地环境不具备米果三合一终端和百度人脸授权硬件,离线授权、摄像头识别、主屏触摸和客屏显示仍需真机验收。
| 编号 | 发现的问题 | 影响 | 修复方案 | 批次 | 状态 |
|---|---|---|---|---|---|
| S-01 | 无网请求失败后显示模态弹框 | 弹框拦截触摸,启动页无法继续操作 | 改为启动页内恢复操作区,提供“重新同步”和“前往设置” | 第一批 | 已修复 |
| S-02 | 首次初始化与已初始化设备使用同一无网处理 | 已有本地数据的设备无法正常离线启动 | 引入 StartupNetworkPolicy,区分远程同步、离线继续和等待首次同步 | 第一批 | 已修复 |
| S-03 | 配置不完整跳转设置后仍继续执行同步 | 产生无效请求、重复页面和状态竞争 | 跳转设置后立即返回,并统一配置完整性检查 | 第一批 | 已修复 |
| S-04 | 启动请求和页面跳转缺少防重复状态 | 连续回调或点击可能产生并发请求、重复跳转 | 增加同步中和已跳转状态保护 | 第一批 | 已修复 |
| S-05 | 网络恢复后缺少页面内反馈 | 用户不知道可以继续初始化 | 监听网络状态,在恢复区提示网络已恢复并允许主动重试 | 第一批 | 已修复 |
| S-06 | 人脸初始化失败沿用人员同步失败降级 | 可能重新进入离线流程并形成失败循环 | 人脸失败使用独立恢复入口 | 第三批 | 已修复 |
| S-07 | 已初始化设备离线点击重试仍被“必须联网”拦截 | 本地人脸初始化失败后无法离线重试 | 引入 StartupRetryPolicy,离线重试本地运行时 | 第三批 | 已修复 |
| 编号 | 发现的问题 | 影响 | 修复方案 | 批次 | 状态 |
|---|---|---|---|---|---|
| D-01 | 批量同步在工作线程直接回调页面 | 存在线程安全和 UI 异常风险 | 数据库任务保留在单线程,页面回调统一切换主线程 | 第一批 | 已修复 |
| D-02 | 部分人员保存失败仍返回整体成功 | 可能写入错误初始化标记 | 使用 BatchSyncResult 统计结果,任一失败即走失败分支 | 第一批 | 已修复 |
| D-03 | 批量同步无法取消 | 页面退出后仍可能继续保存和回调 | 增加取消、中断检查和回调有效性保护 | 第一批 | 已修复 |
| D-04 | 更新人员时使用可能变化的数值 ID | 本地可能残留重复人员 | 使用稳定业务 UUID 定位和替换记录 | 第一批 | 已修复 |
| D-05 | 接口返回体和错误信息缺少空值保护 | 异常响应可能空指针 | 对响应、数据体、错误对象和文案增加兜底 | 第一批 | 已修复 |
| 编号 | 发现的问题 | 影响 | 修复方案 | 批次 | 状态 |
|---|---|---|---|---|---|
| F-01 | 人员同步后又调用旧接口全量下载人脸数据 | 重复请求、重复写库、启动变慢 | 复用人员同步保存的特征,只加载本地库与索引 | 第二批 | 已修复 |
| F-02 | 已初始化设备离线启动时直接进入首页 | 人脸运行时可能未加载 | 离线复用本地授权并加载本地模型与人脸库 | 第三批 | 已修复 |
| F-03 | initPush() 可能早于识别模型完成 | FaceSearch 为空时后台空指针 | 按识别模型、注册模型、数据库、索引顺序初始化并增加空值保护 | 第三批 | 已修复 |
| F-04 | 人脸更新回调线程不统一 | 页面可能在后台线程更新 UI | 回调统一投递主线程并支持解除 | 第一批 | 已修复 |
| F-05 | 人脸失败自动重启或退出 | 用户无法恢复,可能形成循环 | 改为可恢复状态,保留重试和设置入口 | 第一批 | 已修复 |
| F-06 | 在线与离线人脸初始化边界不明确 | 离线设备可能错误发起在线激活 | 在线执行激活,离线复用已有授权文件 | 第三批 | 已修复 |
| 编号 | 发现的问题 | 影响 | 修复方案 | 批次 | 状态 |
|---|---|---|---|---|---|
| L-01 | 人员同步网络请求没有取消句柄 | 页面销毁后可能收到迟到回调 | 透传 Disposable,启动页统一释放 | 第二批 | 已修复 |
| L-02 | 人脸在线激活无法阻止旧页面回调 | 可能推进已销毁启动页 | 返回可取消句柄并使用 Application Context | 第三批 | 已修复 |
| L-03 | 模型管理器持有页面 Context 且无法释放 | 页面销毁后仍可能收到结果 | 使用 Application Context,增加 release() | 第三批 | 已修复 |
| L-04 | 人脸数据库线程无法只取消任务 | 可能泄漏线程或误清空全局数据 | 管理独立执行器,增加不清空数据的 cancel() | 第三批 | 已修复 |
| L-05 | 启动资源未完全统一释放 | 旧页面仍可能跳转或持有资源 | 统一清理网络、批处理、激活、模型、数据库、延迟任务和客屏 | 第一至三批 | 已修复 |
| 编号 | 发现的问题 | 影响 | 修复方案 | 批次 | 状态 |
|---|---|---|---|---|---|
| U-01 | 客屏使用 TYPE_APPLICATION_OVERLAY | 依赖悬浮窗权限并可能影响触摸 | 改为标准 Presentation,删除悬浮窗权限 | 第二批 | 已修复 |
| U-02 | 首页恢复时可能重复创建客屏 | 多个实例和窗口泄漏 | 创建前检查状态,页面销毁主动释放 | 第二批 | 已修复 |
| U-03 | 设备类型使用数字魔法值 | 硬件分支难维护 | 统一使用 DeviceTypeUtils 具名常量 | 第一、二批 | 已修复 |
| U-04 | NewSingleTipPop 缺少无参构造 | 系统恢复 Fragment 失败 | 增加无参构造,文案写入 arguments | 第二批 | 已修复 |
| U-05 | 未知设备弹框恢复后监听丢失 | 确认按钮不执行退出 | 保存请求标识,由重建后的 Activity 处理动作 | 第三批 | 已修复 |
| U-06 | Manifest 存在重复权限 | 配置噪声和构建警告 | 删除重复权限及不再需要的悬浮窗权限 | 第二批 | 已修复 |
第一批优先解决直接阻断用户操作的故障,并修复人员同步链路中的数据正确性问题。
批次记录:2026-09-01-启动页无网与同步流程修复.md/html。
Disposable。Presentation。批次记录:2026-09-01-启动页生命周期与客屏第二批修复.md/html。
批次记录:2026-09-01-启动页离线人脸与生命周期第三批修复.md/html。
| 本地初始化 | 网络 | 人脸支付 | 启动行为 | 最终结果 |
|---|---|---|---|---|
| 未完成 | 无网 | 任意 | 停留启动页,展示重新同步与设置入口 | 页面可触摸,不进入不完整业务 |
| 未完成 | 有网 | 关闭 | 全量同步人员数据 | 成功后进入首页 |
| 未完成 | 有网 | 开启 | 全量同步、在线激活并加载本地人脸 | 全部成功后进入首页 |
| 已完成 | 无网 | 关闭 | 跳过远程同步,使用本地业务数据 | 进入首页 |
| 已完成 | 无网 | 开启 | 跳过远程同步和在线激活,加载本地运行时 | 成功进入首页;失败停留恢复区 |
| 已完成 | 有网 | 关闭 | 增量同步人员数据 | 成功进入首页;失败使用本地数据 |
| 已完成 | 有网 | 开启 | 增量同步并初始化人脸运行时 | 成功进入首页;人脸失败停留恢复区 |
LaunchActivity.java 与三个 startup/*Policy.javaBatchCustomerSyncManager.java、BatchSyncResult.javaCallBackObserver.java、RetrofitClient.javaActivationFaceSDK.java、InitFaceModelManager.java、InitFaceDBApiManager.java、FaceSDKManager.javaNewSingleTipPop.java、activity_launch.xmlJAVA_HOME=$(/usr/libexec/java_home -v 1.8) bash gradlew \
:app:testDebugUnitTest :app:assembleDebug \
--rerun-tasks --console=plain
BUILD SUCCESSFULgit diff --check 通过app/build/outputs/apk/debug/app-debug.apk这里的“能力”只统计已经落到 SellWeight 代码、测试或明确接入约束中的内容。仅有经验描述、尚未解耦的代码,不标记为“可直接复用组件”。
| 能力编号 | 能力名称 | SellWeight 代码证据 | 后续项目可以直接使用的内容 | 当前复用级别 | 使用边界 |
|---|---|---|---|---|---|
| C-01 | 启动网络决策能力 | StartupNetworkPolicy、对应测试 | 由网络和首次同步状态得到远程同步、离线继续、等待首次同步 | 可直接迁移 | 新项目必须定义自己的首次同步完成标记 |
| C-02 | 启动失败恢复决策能力 | StartupRetryPolicy、对应测试 | 区分在线重同步、离线重载本地运行时、等待网络 | 可直接迁移 | 首次安装不能绕过联网初始化 |
| C-03 | 人脸在线/离线初始化决策能力 | StartupFaceInitializationPolicy、对应测试 | 决定跳过人脸、加载本地运行时或在线激活后加载 | 可直接迁移 | 适用于沿用百度人脸授权与本地模型的项目 |
| C-04 | 批量同步完整性判定能力 | BatchSyncResult、BatchCustomerSyncManager、对应测试 | 只有失败数为 0 且成功数等于总数才允许启动成功 | 可直接迁移核心模型 | 跨项目需替换人员保存和人脸同步适配器 |
| C-05 | 可操作的非模态启动恢复能力 | activity_launch.xml、showRecoveryActions()、retryStartupSync() | 失败后保留状态、重新同步和设置入口,页面始终可触摸 | 项目内已复用,跨项目需适配 UI | 首次初始化失败不能静默进入首页 |
| C-06 | 人员与人脸特征单链路落库能力 | CustomerSyncManager、BatchCustomerSyncManager | 以 customerUuid 同步业务库和人脸库,取消重复全量下载 | 同数据模型项目可复用 | 接口必须已经返回人脸特征等字段 |
| C-07 | 百度人脸运行时有序初始化能力 | initializeFaceRuntime()、initModel()、initRegisterModel()、initDBApi() | 固定识别模型、注册模型、本地库、内存索引的初始化顺序 | 同 SDK 项目可复用 | 更换 SDK 时只能复用顺序约束 |
| C-08 | 启动异步任务生命周期托管能力 | CompositeDisposable、各管理器的 cancel()/release()、isActivityUsable() | 统一停止网络、批处理、激活、模型、数据库、延迟跳转和客屏回调 | 项目内组合能力 | 尚未抽成统一任务注册器,新增任务必须人工登记 |
| C-09 | 双屏终端无悬浮窗客屏能力 | TYPE_MIGUO_ALL_IN_ONE、DefaultPresentation、客屏创建与释放逻辑 | 使用标准 Presentation 绑定第二块 Display,无悬浮窗权限 | 同类双屏设备可复用 | 硬件识别需逐机型适配并真机验收 |
StartupNetworkPolicy、StartupRetryPolicy、StartupFaceInitializationPolicy、BatchSyncResult。Constants.FIRST_INIT_FINISH_TAG。Presentation 和真实第二块 Display,设备类型使用具名常量,销毁时必须 dismiss()。BatchSyncResult 尚未发布为公共 Android Library,当前仍是带测试复制或后续抽取公共模块。BatchCustomerSyncManager 依赖 SellWeight 的人员、数据库、人脸库和资源类,不是通用批处理框架。FaceApi 和项目内两套模型管理器,只适合同技术栈项目。onDestroy()。本次最有价值的沉淀不是“无网时不弹框”这一条修复,而是形成了 SellWeight 的启动容错基线:纯策略决定动作、初始化标记控制离线边界、页面内恢复替代网络模态阻塞、同步结果必须完整、百度人脸在线与离线分流、所有异步资源随页面释放、双屏使用标准 Presentation。
C-01 至 C-04 已有独立类和单元测试,可作为后续同类项目的首批迁移资产;C-05 至 C-09 已在 SellWeight 形成代码闭环,但跨项目使用必须按表中依赖和硬件边界适配。
启动页相关代码问题已完成三批修复,自动化测试与 Debug 打包通过。原始故障“无网失败弹框导致整个页面无法触摸”已经从交互机制上移除,并补齐了人员同步、人脸离线初始化、异步生命周期和客屏窗口的关联风险。
本次及三个修复批次均未执行 Git 暂存、提交或推送。