4. 版本命名与版本号治理

在Qualcomm车载FOTA项目中,版本号不是一串随便递增的数字,而是贯穿需求、开发、构建、测试、发布、回滚全链路的“身份标识”。一旦命名规则混乱,轻则导致FOTA包推错车型,重则让T-Box把不兼容的固件刷进错误的硬件SKU,造成变砖。因此,版本治理的核心目标是:让每一个可交付的软件实体,都能被唯一、可解析、可追溯地标识,并且能自动判断“能不能装、该不该升、能不能回滚”。

一、四层标识的分工:语义化版本、构建号、基线号、SKU/变体

Qualcomm车载项目通常同时存在四类标识,它们解决的是不同维度的问题,不能互相替代:

  • 语义化版本(SemVer):面向“功能与兼容性”,格式为 MAJOR.MINOR.PATCH。MAJOR 变更表示不兼容的接口或行为变化;MINOR 表示向后兼容的新功能;PATCH 表示向后兼容的缺陷修复。例如 2.4.1 表示第2代大版本、第4个功能增量、第1个补丁。
  • 构建号(Build Number):面向“某一次具体编译产物”,通常由CI流水线自动生成,如 B20240612.3 或递增整数 10457。它保证同一语义化版本下每一次构建都可区分,便于定位测试包与正式包。
  • 基线号(Baseline ID):面向“一组组件的冻结集合”。车载项目常把多个仓库(QNX、Android、MCU、DSP、Modem)在某一时刻的提交锁定为一个基线,如 BL-ADAS-2024Q2-07。基线号是发布与回滚的最小治理单元。
  • 硬件SKU与软件变体:面向“同一软件跑在不同硬件配置上”。例如 SA8155P 与 SA8295P 是不同SKU;同一SKU下又可能有“带后排屏/不带后排屏”“国内版/出口版”等软件变体。

这四者组合起来,才构成一个完整的版本身份。推荐的可解析版本串形式为:

SW=2.4.1+B20240612.3
BL=BL-ADAS-2024Q2-07
SKU=SA8295P
VARIANT=CN-PREMIUM

其中 SW 是语义化版本与构建号的组合,BL 是基线号,SKU 与 VARIANT 共同限定目标硬件与配置。FOTA服务器在推送前,必须用这四个字段与车端上报的当前版本做匹配,任何一项不满足兼容矩阵,就应拒绝升级。

Qualcomm车载FOTA版本标识与兼容判定关系 版本标识四要素 语义化版本 SemVer MAJOR.MINOR.PATCH 功能与兼容性 构建号 Build B20240612.3 CI产物唯一性 基线号 Baseline BL-ADAS-2024Q2-07 组件冻结集合 SKU / 变体 SA8295P / CN-PREMIUM 硬件与配置限定 FOTA兼容判定矩阵 ① SKU匹配:目标SKU == 车端SKU SA8295P → SA8295P ✓ ② 变体匹配:VARIANT在允许列表 CN-PREMIUM ∈ {CN-PREMIUM, CN-STD} ③ 基线兼容:BL依赖关系满足 BL-ADAS-2024Q2-07 ≥ 最低要求 ④ 版本递增:SemVer > 当前版本 2.4.1 > 2.3.8 ✓ 四项全部通过 → 允许升级 ✓ 允许升级 写入A/B分区备用槽 记录版本指纹到日志 保留回滚基线号 BL-ADAS-2024Q2-07 ✗ 拒绝升级 SKU不匹配 / 变体不允许 基线依赖冲突 版本回退或降级 上报错误码 + 保持当前版本 冲突消解原则:SKU/变体不匹配 → 直接拒绝;基线冲突 → 先升级基线再升级应用;SemVer回退 → 仅允许在回滚窗口内执行

二、编码规则:让版本号可被机器解析

版本号治理的第一步是“可解析”。建议在项目内统一约定以下编码规则,并写入构建脚本与FOTA服务端校验逻辑:

  • 语义化版本:严格三段式,禁止出现 2.4 或 2.4.1.3 这类非标准写法。预发布版本用 -rc.1、-beta.2 后缀,且预发布版本不得推送到量产车。
  • 构建号:采用 B<yyyyMMdd>.<当日序号>,例如 B20240612.3。构建号由CI自动注入,禁止手工修改,保证与代码提交一一对应。
  • 基线号:采用 BL-<域>-<年季>-<序号>,例如 BL-ADAS-2024Q2-07。域包括 ADAS、IVI、TBOX、MCU 等,便于按域独立冻结与回滚。
  • SKU:直接使用Qualcomm芯片型号,如 SA8155P、SA8295P,避免自造缩写。
  • 软件变体:采用 <区域>-<配置等级>,如 CN-PREMIUM、EU-STD。区域与配置等级必须在项目配置表中预先枚举,不允许自由发挥。

三、冲突消解:当版本号“打架”时怎么办

实际项目中最常见的冲突有四类,处理原则如下:

冲突类型 典型场景 消解策略
SKU不匹配 SA8155P的包被推送到SA8295P车辆 FOTA服务端在推送前校验SKU字段,不匹配直接拒绝并记录审计日志
变体越界 CN-PREMIUM包推送到CN-STD车辆 变体白名单机制,只有目标变体在允许列表内才放行
基线依赖冲突 应用要求BL-ADAS-2024Q2-07,车端仍是Q1-05 先推送基线升级包,基线就绪后再推送应用包;或打包为组合升级包
版本回退/降级 车端当前2.4.1,目标包2.3.8 默认拒绝;仅在回滚窗口内、且由后台显式下发回滚指令时允许
实践建议:把上述四项校验做成FOTA服务端的“准入网关”,任何升级请求先过网关再进入下载与安装流程。网关的判定结果要写入车端日志与云端审计表,便于事后追溯“为什么这辆车没升上去”。

四、一个可落地的版本清单示例

下面给出一份可直接用于项目配置的版本清单模板,字段与Qualcomm车载项目实际治理需求对齐:

{
  "sw_version": "2.4.1",
  "build_number": "B20240612.3",
  "baseline_id": "BL-ADAS-2024Q2-07",
  "target_sku": "SA8295P",
  "variant": "CN-PREMIUM",
  "min_baseline": "BL-ADAS-2024Q2-05",
  "rollback_window_hours": 72,
  "prerelease": false
}

其中 min_baseline 表示允许升级的最低基线,rollback_window_hours 表示回滚窗口时长。FOTA服务端读取该清单后,与车端上报的 current_sw、current_bl、sku、variant 逐项比对,四项全部通过才生成下载任务。这样,版本号就不再是“贴上去的标签”,而是真正参与升级决策的治理数据。

注意:语义化版本的MAJOR变更必须伴随兼容性评审,不能由开发人员自行决定。建议在代码仓库中设置 VERSION 文件,并由CI在合并到发布分支时校验其变更是否符合评审记录,防止“悄悄升大版本”导致FOTA兼容矩阵失效。

总结来说,Qualcomm车载FOTA的版本治理,本质上是把“语义化版本、构建号、基线号、SKU与变体”四类标识统一到一套可解析、可校验、可追溯的编码规则中,并用兼容判定矩阵把冲突挡在升级之前。做到这一点,版本号才真正成为质量与安全的守门人,而不是事后扯皮的依据。