# T-AND-010 「关于」清单展示当前版本号 - **状态**: done - **依赖**: T-AND-008 - **文档**: v1.6 §11(版本号展示) ## 目标 「关于」清单展示当前运行版本,且版本号只有一处权威定义。 ## 方案(单一来源,禁止手写) | 项 | 来源 | |--|--| | 应用版本 | `app/build.gradle.kts` 的 `versionName`(= `project.yaml` 的 `version`)→ `BuildConfig.VERSION_NAME` | | 契约版本 | 构建期解析 `contracts/VERSION`,逐项注入 `BuildConfig.CONTRACT_` 与 `CONTRACT_VERSION_KEYS/VALUES` | 由此带来两点硬约束: 1. `versionCode` 按文档 §11.1 的规则递增:`10000*主 + 100*次 + 修订` (本次 `0.2.0` → `200`); 2. `Credits` 原先的单个 `CONTRACT_VERSION = "0.1.0"` 常量被删除 —— 六项契约已各自独立递增(`rest-api 0.5.0` / `websocket-keypoints 0.2.0` / `data-models 0.7.0` …),单个常量必然失真。 `Credits.contractVersions` 直接读 `BuildConfig`,界面不出现任何版本号字面量。 ## 构建期强制校验 `app/build.gradle.kts` 新增 `checkReleaseConsistency` 任务,并挂到每个变体的 `preBuild` 上(任何构建都会先跑): - `versionName` 必须等于 `project.yaml` 的 `version`; - `contracts/VERSION` 的 `websocket-keypoints` 必须等于 `0.2.0`(本端是发送方); - `versionCode` 必须与 `versionName` 按上述公式自洽。 任何一项不一致直接 **BUILD FAILED**,不让版本漂移进入产物。 ## 验收(文档 §11.3) | 验收项 | 结果 | |--|--| | 关于清单可见 `vX.Y.Z` | ✅ 清单首行「客户端版本:v0.2.0」,另有「版本号(整数):200」 | | 与 `versionName` / APK 文件名一致 | ✅ `opendance-android-v0.2.0.apk`;`checkReleaseConsistency` 强制 | | 六项契约版本逐项展示 | ✅ 清单逐行列「契约 rest-api: v0.5.0」等 | | 界面代码无版本号字面量 | ✅ `CreditsTest.appVersionMatchesProjectYaml` / `everyContractVersionMatchesTheSnapshot` 核对 |