修复设备 A 学习菜品后,设备 B 同步学习图片成功但无法识别的问题,同时保证同步失败、SDK 校正失败或进程中断时,设备 B 仍可回退到上一份可用学习数据。
2026-07-22 引入 staging 事务目录后,同步流程把下载图片保存在临时目录,并在 learnDateRivise() 返回成功后立即替换正式目录。SDK 的即时返回仅表示请求已受理,真正的学习特征重建通过异步进度回调完成;原流程没有等待进度到 100,且校正时使用的目录随后被重命名,导致 SDK 后台读取路径不稳定,从而出现跨设备同步后无法识别。
本次未变更 SDK AAR,修复位于应用侧的同步事务和 SDK 异步完成判定。
DishLearningRevisionRunner,将 SDK 即时受理结果与异步最终结果分离:即时响应确认成功前只缓冲进度,仅进度 100 视为成功,-1、中断和请求拒绝均视为失败。DishLearningOperationCoordinator,将完整同步、菜品新增学习、删除学习图片和识别页替换学习统一串行化,避免它们同时改写正式目录或消费同一组全局 SDK 回调。.sync_recovery_required 持久标记;SDK 进度到 100 时再写 confirmed 标记并清除恢复标记,最后提交 backup。即使恢复 backup 后、旧特征重建完成前再次崩溃,下次启动仍会继续阻断识别并重建特征。release() 路径、保留 root 与 backup 事务现场、唤醒并拒绝已排队的学习写、暂停菜品识别与学习预览,并提示重启。新进程首次使用协调器时会检查未确认 backup,在菜品管理完成旧目录与旧特征恢复前继续阻止识别和所有学习写。app/src/main/java/com/cpt/aidishrecognition/activity/DishManagementActivity.javaapp/src/main/java/com/cpt/aidishrecognition/activity/DishRecognitionActivity.javaapp/src/main/java/com/cpt/aidishrecognition/activity/NewDishLearningActivity.javaapp/src/main/java/com/cpt/aidishrecognition/ai/DishLearningOperationCoordinator.javaapp/src/main/java/com/cpt/aidishrecognition/ai/AiSdkManager.javaapp/src/main/java/com/cpt/aidishrecognition/ai/DishLearningRevisionRunner.javaapp/src/main/java/com/cpt/aidishrecognition/utils/DishLearningStore.javaapp/src/main/java/com/cpt/aidishrecognition/utils/DishManagementSyncPolicy.javaapp/src/main/res/values/strings.xmlapp/src/test/java/com/cpt/aidishrecognition/ai/DishLearningRevisionRunnerTest.javaapp/src/test/java/com/cpt/aidishrecognition/ai/DishLearningOperationCoordinatorTest.javaapp/src/test/java/com/cpt/aidishrecognition/utils/DishLearningStoreFullSyncTest.javaapp/src/test/java/com/cpt/aidishrecognition/utils/DishManagementSyncPolicyTest.java./gradlew :app:testDebugUnitTest :app:assembleDebug:通过,BUILD SUCCESSFUL;共 94 个单元测试,0 failure、0 error。git diff --check:通过,无空白错误。本次仅修改和验证工作区文件,未主动执行暂存、提交、推送、切换分支、合并或变基。任务结束检查时发现索引中已有部分阶段性改动,同时工作区还有后续修复和未跟踪新文件;提交前必须以当前工作树重新核对并完整暂存,不能直接提交现有索引快照。