SellWeight 启动页问题修复汇总

文档信息

项目:SellWeight
汇总日期:2026-09-02
涉及范围:启动页、人员同步、人脸初始化、客屏展示及相关生命周期
修复批次:3 批
能力沉淀:9 项,其中 4 项具备独立类或测试,可直接迁移;5 项为 SellWeight 项目内组合能力
代码状态:已完成
自动化验证:通过
最终验收状态:代码验收通过,米果三合一真机验收待执行

一、背景与最终结论

本次问题由“设备无网时启动页弹出失败弹框,导致整个页面无法触摸”触发。排查后发现,启动链路除模态弹框外,还存在离线策略缺失、配置分支穿透、批量同步结果误判、后台线程更新 UI、异步任务未随页面释放、重复下载人脸数据、客屏依赖悬浮窗权限、离线启动跳过人脸运行时等关联风险。

上述代码问题已分三批完成修复。最终启动流程能够区分首次初始化和已初始化设备,网络失败时不再以模态弹框锁死页面;人员、人脸及客屏任务具备明确的成功、失败、降级和释放路径。

当前没有已知的启动页代码遗留。由于本地环境不具备米果三合一终端和百度人脸授权硬件,离线授权、摄像头识别、主屏触摸和客屏显示仍需真机验收。

二、问题、修复方案与批次总表

2.1 启动交互与状态控制

编号发现的问题影响修复方案批次状态
S-01无网请求失败后显示模态弹框弹框拦截触摸,启动页无法继续操作改为启动页内恢复操作区,提供“重新同步”和“前往设置”第一批已修复
S-02首次初始化与已初始化设备使用同一无网处理已有本地数据的设备无法正常离线启动引入 StartupNetworkPolicy,区分远程同步、离线继续和等待首次同步第一批已修复
S-03配置不完整跳转设置后仍继续执行同步产生无效请求、重复页面和状态竞争跳转设置后立即返回,并统一配置完整性检查第一批已修复
S-04启动请求和页面跳转缺少防重复状态连续回调或点击可能产生并发请求、重复跳转增加同步中和已跳转状态保护第一批已修复
S-05网络恢复后缺少页面内反馈用户不知道可以继续初始化监听网络状态,在恢复区提示网络已恢复并允许主动重试第一批已修复
S-06人脸初始化失败沿用人员同步失败降级可能重新进入离线流程并形成失败循环人脸失败使用独立恢复入口第三批已修复
S-07已初始化设备离线点击重试仍被“必须联网”拦截本地人脸初始化失败后无法离线重试引入 StartupRetryPolicy,离线重试本地运行时第三批已修复

2.2 人员同步与数据一致性

编号发现的问题影响修复方案批次状态
D-01批量同步在工作线程直接回调页面存在线程安全和 UI 异常风险数据库任务保留在单线程,页面回调统一切换主线程第一批已修复
D-02部分人员保存失败仍返回整体成功可能写入错误初始化标记使用 BatchSyncResult 统计结果,任一失败即走失败分支第一批已修复
D-03批量同步无法取消页面退出后仍可能继续保存和回调增加取消、中断检查和回调有效性保护第一批已修复
D-04更新人员时使用可能变化的数值 ID本地可能残留重复人员使用稳定业务 UUID 定位和替换记录第一批已修复
D-05接口返回体和错误信息缺少空值保护异常响应可能空指针对响应、数据体、错误对象和文案增加兜底第一批已修复

2.3 人脸数据与离线初始化

编号发现的问题影响修复方案批次状态
F-01人员同步后又调用旧接口全量下载人脸数据重复请求、重复写库、启动变慢复用人员同步保存的特征,只加载本地库与索引第二批已修复
F-02已初始化设备离线启动时直接进入首页人脸运行时可能未加载离线复用本地授权并加载本地模型与人脸库第三批已修复
F-03initPush() 可能早于识别模型完成FaceSearch 为空时后台空指针按识别模型、注册模型、数据库、索引顺序初始化并增加空值保护第三批已修复
F-04人脸更新回调线程不统一页面可能在后台线程更新 UI回调统一投递主线程并支持解除第一批已修复
F-05人脸失败自动重启或退出用户无法恢复,可能形成循环改为可恢复状态,保留重试和设置入口第一批已修复
F-06在线与离线人脸初始化边界不明确离线设备可能错误发起在线激活在线执行激活,离线复用已有授权文件第三批已修复

2.4 生命周期与异步任务

编号发现的问题影响修复方案批次状态
L-01人员同步网络请求没有取消句柄页面销毁后可能收到迟到回调透传 Disposable,启动页统一释放第二批已修复
L-02人脸在线激活无法阻止旧页面回调可能推进已销毁启动页返回可取消句柄并使用 Application Context第三批已修复
L-03模型管理器持有页面 Context 且无法释放页面销毁后仍可能收到结果使用 Application Context,增加 release()第三批已修复
L-04人脸数据库线程无法只取消任务可能泄漏线程或误清空全局数据管理独立执行器,增加不清空数据的 cancel()第三批已修复
L-05启动资源未完全统一释放旧页面仍可能跳转或持有资源统一清理网络、批处理、激活、模型、数据库、延迟任务和客屏第一至三批已修复

2.5 客屏、权限与通用弹框

编号发现的问题影响修复方案批次状态
U-01客屏使用 TYPE_APPLICATION_OVERLAY依赖悬浮窗权限并可能影响触摸改为标准 Presentation,删除悬浮窗权限第二批已修复
U-02首页恢复时可能重复创建客屏多个实例和窗口泄漏创建前检查状态,页面销毁主动释放第二批已修复
U-03设备类型使用数字魔法值硬件分支难维护统一使用 DeviceTypeUtils 具名常量第一、二批已修复
U-04NewSingleTipPop 缺少无参构造系统恢复 Fragment 失败增加无参构造,文案写入 arguments第二批已修复
U-05未知设备弹框恢复后监听丢失确认按钮不执行退出保存请求标识,由重建后的 Activity 处理动作第三批已修复
U-06Manifest 存在重复权限配置噪声和构建警告删除重复权限及不再需要的悬浮窗权限第二批已修复

三、分批修复过程

3.1 第一批:无网交互、同步正确性和基础生命周期

第一批优先解决直接阻断用户操作的故障,并修复人员同步链路中的数据正确性问题。

批次记录:2026-09-01-启动页无网与同步流程修复.md/html

3.2 第二批:重复人脸请求、网络取消和客屏权限

批次记录:2026-09-01-启动页生命周期与客屏第二批修复.md/html

3.3 第三批:离线人脸闭环和 SDK 生命周期

批次记录:2026-09-01-启动页离线人脸与生命周期第三批修复.md/html

四、修复后的启动状态矩阵

本地初始化网络人脸支付启动行为最终结果
未完成无网任意停留启动页,展示重新同步与设置入口页面可触摸,不进入不完整业务
未完成有网关闭全量同步人员数据成功后进入首页
未完成有网开启全量同步、在线激活并加载本地人脸全部成功后进入首页
已完成无网关闭跳过远程同步,使用本地业务数据进入首页
已完成无网开启跳过远程同步和在线激活,加载本地运行时成功进入首页;失败停留恢复区
已完成有网关闭增量同步人员数据成功进入首页;失败使用本地数据
已完成有网开启增量同步并初始化人脸运行时成功进入首页;人脸失败停留恢复区

五、关键实现文件

六、测试与验证证据

6.1 TDD 过程

6.2 最终自动化验证

JAVA_HOME=$(/usr/libexec/java_home -v 1.8) bash gradlew \
  :app:testDebugUnitTest :app:assembleDebug \
  --rerun-tasks --console=plain

6.3 已覆盖的策略场景

七、真机验收清单

八、已知边界与非阻断项

九、本次修复形成的可复用能力

这里的“能力”只统计已经落到 SellWeight 代码、测试或明确接入约束中的内容。仅有经验描述、尚未解耦的代码,不标记为“可直接复用组件”。

9.1 能力清单与成熟度

能力编号能力名称SellWeight 代码证据后续项目可以直接使用的内容当前复用级别使用边界
C-01启动网络决策能力StartupNetworkPolicy、对应测试由网络和首次同步状态得到远程同步、离线继续、等待首次同步可直接迁移新项目必须定义自己的首次同步完成标记
C-02启动失败恢复决策能力StartupRetryPolicy、对应测试区分在线重同步、离线重载本地运行时、等待网络可直接迁移首次安装不能绕过联网初始化
C-03人脸在线/离线初始化决策能力StartupFaceInitializationPolicy、对应测试决定跳过人脸、加载本地运行时或在线激活后加载可直接迁移适用于沿用百度人脸授权与本地模型的项目
C-04批量同步完整性判定能力BatchSyncResultBatchCustomerSyncManager、对应测试只有失败数为 0 且成功数等于总数才允许启动成功可直接迁移核心模型跨项目需替换人员保存和人脸同步适配器
C-05可操作的非模态启动恢复能力activity_launch.xmlshowRecoveryActions()retryStartupSync()失败后保留状态、重新同步和设置入口,页面始终可触摸项目内已复用,跨项目需适配 UI首次初始化失败不能静默进入首页
C-06人员与人脸特征单链路落库能力CustomerSyncManagerBatchCustomerSyncManagercustomerUuid 同步业务库和人脸库,取消重复全量下载同数据模型项目可复用接口必须已经返回人脸特征等字段
C-07百度人脸运行时有序初始化能力initializeFaceRuntime()initModel()initRegisterModel()initDBApi()固定识别模型、注册模型、本地库、内存索引的初始化顺序同 SDK 项目可复用更换 SDK 时只能复用顺序约束
C-08启动异步任务生命周期托管能力CompositeDisposable、各管理器的 cancel()/release()isActivityUsable()统一停止网络、批处理、激活、模型、数据库、延迟跳转和客屏回调项目内组合能力尚未抽成统一任务注册器,新增任务必须人工登记
C-09双屏终端无悬浮窗客屏能力TYPE_MIGUO_ALL_IN_ONEDefaultPresentation、客屏创建与释放逻辑使用标准 Presentation 绑定第二块 Display,无悬浮窗权限同类双屏设备可复用硬件识别需逐机型适配并真机验收

9.2 后续项目的直接接入顺序

  1. 先复制三个纯策略类及四个单元测试:StartupNetworkPolicyStartupRetryPolicyStartupFaceInitializationPolicyBatchSyncResult
  2. 定义首次初始化完成标记。只有人员落库成功且启用的人脸运行时初始化成功后才写入;SellWeight 对应 Constants.FIRST_INIT_FINISH_TAG
  3. 接入页面内恢复区,分别处理首次初始化必须联网、已初始化可离线和人脸运行时失败,禁止重新引入网络失败模态弹框。
  4. 批量同步保留结果统计、单线程、主线程回调和取消语义,替换新项目的数据适配实现。
  5. 百度人脸项目按当前初始化顺序接入;接口已经携带特征时,不再调用旧人脸全量下载接口。
  6. 为每个异步动作登记取消或释放方法,页面销毁时集中调用,回调前统一检查 Activity 是否可用。
  7. 双屏页面只使用标准 Presentation 和真实第二块 Display,设备类型使用具名常量,销毁时必须 dismiss()
  8. 复用第四节状态矩阵和第七节真机清单验收,不能只验证有网启动。

9.3 暂时不能宣称为通用组件的部分

9.4 项目级沉淀结论

本次最有价值的沉淀不是“无网时不弹框”这一条修复,而是形成了 SellWeight 的启动容错基线:纯策略决定动作、初始化标记控制离线边界、页面内恢复替代网络模态阻塞、同步结果必须完整、百度人脸在线与离线分流、所有异步资源随页面释放、双屏使用标准 Presentation。

C-01 至 C-04 已有独立类和单元测试,可作为后续同类项目的首批迁移资产;C-05 至 C-09 已在 SellWeight 形成代码闭环,但跨项目使用必须按表中依赖和硬件边界适配。

十、最终验收结论

启动页相关代码问题已完成三批修复,自动化测试与 Debug 打包通过。原始故障“无网失败弹框导致整个页面无法触摸”已经从交互机制上移除,并补齐了人员同步、人脸离线初始化、异步生命周期和客屏窗口的关联风险。

代码验收通过,具备真机验收条件;最终生产验收需在米果三合一设备完成第七节清单。

本次及三个修复批次均未执行 Git 暂存、提交或推送。