| 【PR】: 简要描述
Co-authored-by: pan-tong<pantong@huawei.com>
# message auto-generated for no-merge-commit merge:
!2367 merge feat/plugin-version-compat into master
【PR】: 简要描述
Created-by: pan-tong
Commit-by: pan-tong
Merged-by: cann-robot
Description: # Pull Request
## 描述
新增 host/device compat 插件包基于 **DRV 升级策略 + version + timestamp + checkcode** 的多级装包决策,避免在 host/device 插件包内容已一致时重复下发,并支持版本回退/前进的精准控制。
在 LoadPackageToDeviceByConfig 中识别 compat 插件包后,按以下优先级判定是否真实下发:
1. **DRV 升级策略**:通过 halGetDeviceInfo(MODULE_TYPE_SYSTEM, INFO_TYPE_SWPLUGIN_UPGRADE_FLAG) 取 PluginUpdateStrategy:
- PLUGIN_NO_UPDATE:跳过该包;
- PLUGIN_FORCE_UPDATE:忽略版本,回落 checkcode(一致仍跳过避免无意义传输);
- PLUGIN_NOT_FORCE_UPDATE:进入版本比较。
- DRV 调用失败或返回值不在 [0,2] 范围内:打 TSD_RUN_WARN 并回落到 PLUGIN_NOT_FORCE_UPDATE(走版本比较),流程不拦截;失败结果不缓存,下次仍可重试。
2. **device 侧版本可得性**:device 未上报版本(旧 tsdaemon / 未加载过)时回落 checkcode;host 侧 .ini 缺失或解析失败时跳过下发并打 WARN。
3. **PluginPkgVersionUtil::Compare**:host 新于 device → 装;host 旧于或等于 device → 跳过。
### 数据通路
- **host 侧 compat 插件包版本采集**:由 PackageProcessConfig::RefreshHostPluginVersions 在 LoadPackageConfigInfoToDevice 中调用,遍历 configMap_ 仅对 COMPAT_PLUGIN_PATH 的条目解析同名 .ini 文件得到 version/timestamp,结果存入 PackageProcessConfig::hostPluginVersions_,并由 ConstructPkgConfigMsg 写入 host_plugin_versions 字段随 TSD_UPDATE_PACKAGE_PROCESS_CONFIG 一并下发。
- **device 侧版本回传**:device 在收到 TSD_UPDATE_PACKAGE_PROCESS_CONFIG 后,于 TSD_UPDATE_PACKAGE_PROCESS_CONFIG_RSP 的 device_plugin_versions 字段回填本地已加载 compat 插件包版本,host 侧 ProcessModeMsgParse::DeviceMsgProcess 收到后调用 HandleDevicePluginVersionRsp 把数据存入 ProcessModeManager::devicePluginVersions_。
### 工具函数整合
- plugin_pkg_version.cpp 中的 Trim/Split/CompareSegmentNumeric 抽出到 tsd_util_func:
- tsd::SplitByChar、tsd::CompareSegmentNumeric 直接迁出;
- 因 tsd_util_func.cpp 已存在仅去空格的 Trim,新增并保留语义上去全部空白字符的 tsd::TrimWhitespace,避免修改既有调用方。
- PluginPkgVersionUtil::ParseIniFile 限制最多解析 10 行,且在拿到 version + timestamp 后立刻 break。
### Loader 圈复杂度治理
- 将 LoadPackageToDeviceByConfig 的圈复杂度降到 20 以下,抽取两个辅助函数:
- GetTrustedBasePathFromDevice:封装 drvHdcGetTrustedBasePathV2 取信任根路径;
- LoadSinglePackageToDevice:封装单个包的「是否需要加载 → 取路径 → 计算 hash → compat 版本/策略判定 → checkcode 判定 → 下发」全流程,返回 TSD_StatusT。
- 主函数仅保留「支持性判断 + 取路径 + 遍历配置」骨架,逻辑等价、可读性更佳。
## 单元测试
- tsd_client_utest:673/673 通过。
- 新增/调整的用例覆盖:IsCompatPluginPackage、GetPluginUpdateStrategy(含 DRV 失败/越界 fallback)、ShouldLoadCompatPluginPkg(NoUpdate/Force/ForceHashSame/DeviceVersionEmpty±HashSame/HostNewer/HostOlder/SameVersion/HostIniMissing)、ConstructOpenMsg_DoesNotCarryPluginInfo、PluginPkgVersionUtil 解析与比较。
## 变更类型
- [ ] 🐛 Bug 修复
- [x] ✨ 新功能
- [ ] 💄 代码风格更新(格式化,局部变量)
- [x] ♻️ 重构(既不修复错误也不增加功能的代码变动)
- [ ] 📦 构建过程或辅助工具的变动
- [ ] 📝 文档内容更新
## 关联的Issue
#582
## 如何测试
1. 编译构建 runtime,确保 tsd_client_utest 通过;
2. 运行 tsd_client_utest,重点覆盖 LoadPackageToDeviceByConfig、GetPluginUpdateStrategy、ShouldLoadCompatPluginPkg、PluginPkgVersionUtil 等用例;
3. host/device 联调场景验证 compat 插件包按版本/策略下发与跳过逻辑。

## Self-check
- [x] 代码符合贡献指南
- [x] 已构建并通过单元测试
- [x] 提交信息符合规范
See merge request: cann/runtime!2367 | 23 小时前 |