Files
luyangyi 3091eb7606 卡片支持应用分身:新增appIndex字段贯穿卡片生命周期
一、数据模型新增 appIndex 字段(0=主应用,>0=分身)
- FormRecord:运行时业务载体
- FormDBInfo:DB 持久化,含 JSON 序列化(ToJson/FromJson/Compare)
- FormItemInfo:AddForm 流程传递载体

二、BMS 接口
- FormBmsHelper 新增 GetEnabledCloneIndex,基于 GetMainAndCloneBundleInfo
  获取当前 enable 的分身 appIndex(产品约定每用户最多一个 enable;
  若同时存在多个,优先取主应用)
- 主应用索引常量复用 bundle_constants.h 的 Constants::MAIN_APP_INDEX,
  替换全部魔法数字 0
- GetBundleInfoByFlags、GetApplicationInfo 迁移到 V9 flag 体系
  (GetBundleInfoFlag/GetApplicationFlag),并新增 WITH_DISABLE flag,
  分身被禁用时仍可查询 bundle 信息;GetApplicationInfoByFlag(bool)
  替换为 GetApplicationInfo(ErrCode)

三、业务流程按 appIndex 过滤
- AddForm:查 BMS 获取 enable 分身 appIndex 写入 FormRecord
- PACKAGE_REMOVED:分身卸载只删该分身卡片,主应用卸载删全部
- PACKAGE_CHANGED:升级刷新处理全量卡片(分身共享主应用 hap 包,
  BMS 不为分身发独立升级广播)
- PACKAGE_DATA_CLEARED:事件不带实例标识,服务端反查 GetEnabledCloneIndex
  解析当前 enable 实例后过滤;解析失败则整体跳过,不做全量误伤
- ReloadForms/ReloadAllForms:只刷新当前 enable 分身的卡片
- FormDbCache 查询/删除支持 appIndex 过滤
- ProcessBundleVersionMap:对账时对缺席 versionMap 的 bundle 用
  GetBundleInfoByFlags 兜底确认真卸载,避免误清禁用 bundle 的 FormInfo
  (QueryExtensionAbilityInfosByType 跳过禁用且不可换 V9,详见设计文档 5.6)

四、可见性与查询
- 移除 FormVisibilityAdapter 中 instIndex!=0 一刀切拒绝逻辑
- HasFormVisible 增加 appIndex 精确匹配(instIndex 与 appIndex 同值)
- GetFormInstancesByFilter 等接口按 appIndex 过滤并填充结果
- GetFormInstancesByFilter server 端解析 enable 分身 appIndex,不对外暴露;
  填充 FormInstance.appIndex(字段上游既有)

五、调试
- FormDumpMgr dump 输出展示 appIndex

AI[97%] Human Fixed[0%] Human[3%] AI Adopted[100%]
Co-authored-by: claude (glm-5.2) <ai@local>

Change-Id: I32aa148e7b732db7963cf3a19be26c68ce63da24
Signed-off-by: luyangyi <luyangyi2@huawei.com>
2026-08-03 22:34:53 +08:00
..
2026-01-17 15:19:52 +08:00