test(packaging): APK 产物版本元数据校验(T-AND-013)+ 修 die 在定义前被调用
文档 §11.2 要求「版本号单一来源 + 可核对」。本仓库原有校验只覆盖**构建配置**
(gradle verifyReleaseVersion 比 versionName ↔ project.yaml)。但版本号真正被
系统与用户看到的地方是 **APK 的 AndroidManifest**:安装界面、应用信息页、
dumpsys package 读的都是它。构建缓存、复用旧 APK、打包时拷错文件都会造成
「配置全对、产物是旧版」——配置层校验抓不到。
这不是假设:同批工作里 Windows 端 v0.2.1 的发布包就是配置文件全一致、
exe 属性页显示 0.1.0(opendance-windows/tasks/017-pe-version.md)。
新增:
* build/check_apk_version.py:直接解析 APK 内 AndroidManifest.xml(二进制 AXML)
的 versionName / versionCode。只依赖 Python 标准库,不需要 Android SDK/aapt2。
AXML 解析:顶层 ResChunk_header → 字符串池(UTF-8 与 UTF-16 都要处理)→
START_ELEMENT;属性名本身就在字符串池里,按文本匹配即可,无需资源映射表;
* build/check-apk-version.sh:薄包装,期望版本缺省取 project.yaml,
并校验 versionCode == 10000*主 + 100*次 + 修订(§11.1);
* build/verify.sh 步骤 3/3 新增「版本元数据」计分项(原先只 aapt2 打印一行);
* build/package-release.sh 打包前校验源 APK,不一致即 die。
交叉验证(与 aapt2 dump badging 逐项一致):
v0.1.0 APK -> versionCode 1 / versionName 0.1.0
v0.2.0 APK -> versionCode 200 / versionName 0.2.0
app/build/outputs/apk/release/app-release.apk -> 同 v0.2.0
反向验证(用真实旧产物当负例):
bash build/check-apk-version.sh dist-release/opendance-android-v0.1.0/app-release.apk
✗ versionName 是 '0.1.0',期望 '0.2.0'
✗ versionCode 是 1,期望 200
退出码 1
顺带修复:build/package-release.sh 第 31/33 行用 die 报版本不一致,但 die()
到第 40 行才定义。命中该分支时输出的是
build/package-release.sh: 行 31: die: 未找到命令 (退出码 127)
脚本确实中止了,但用户完全看不出真实原因。现把 log()/die() 移到首次使用之前:
[error] 版本号不一致:参数/versionName=9.9.9,project.yaml=0.2.0 (退出码 1)
未新发版本:APK 内容与 v0.2.0 完全一致(产物侧校验证明其 versionName/versionCode
本就正确),本次改动只涉及构建/校验脚本与文档,故不为它提版本号;
README.txt 的新增自检项会随下一次 Android 发布进入发布包。
This commit is contained in:
@@ -9,7 +9,7 @@ OpenDance Studio **阶段三**: Android 辅助 App(Kotlin + CameraX + MediaPipe
|
||||
|
||||
## 状态
|
||||
|
||||
**阶段三已完成**: T-AND-001 -> T-AND-012 全部落地(含重连状态机与 MediaPipe 崩溃修复)。
|
||||
**阶段三已完成**: T-AND-001 -> T-AND-013 全部落地(含重连状态机、MediaPipe 崩溃修复、APK 产物版本元数据校验)。
|
||||
|
||||
| 验收项 | 结果 |
|
||||
|--|--|
|
||||
@@ -20,6 +20,7 @@ OpenDance Studio **阶段三**: Android 辅助 App(Kotlin + CameraX + MediaPipe
|
||||
| 包信息 | OK `com.opendance.studio` v0.2.0, minSdk 29(Android 10+)/ targetSdk 34 |
|
||||
| 模型随包分发 | OK `assets/pose_landmarker_lite.task` 5.7 MB(Stored 未压缩) |
|
||||
| ABI 覆盖 | OK arm64-v8a + armeabi-v7a(debug 额外含 x86/x86_64) |
|
||||
| APK 版本元数据 | OK 直接读产物 `AndroidManifest` 的 `versionName=0.2.0`/`versionCode=200`,与 `project.yaml` 一致(T-AND-013) |
|
||||
|
||||
## 快速开始
|
||||
|
||||
@@ -255,6 +256,21 @@ app/src/main/java/com/opendance/studio/
|
||||
(= `project.yaml` 的 `version` = APK 文件名 = Git tag),契约版本在构建期从
|
||||
`contracts/VERSION` 解析后注入 `BuildConfig`;Kotlin 界面代码里不出现任何版本号字面量。
|
||||
|
||||
**产物侧复核(T-AND-013)**:`versionName` 是**构建配置**,而安装界面 / 应用信息页 /
|
||||
`dumpsys package` 读的是 **APK 的 `AndroidManifest`**。构建缓存、复用旧 APK、
|
||||
打包时拷错文件都会造成「配置全对、产物是旧版」,配置层校验抓不到(Windows 端
|
||||
v0.2.1 就踩过同类坑)。因此新增:
|
||||
|
||||
```bash
|
||||
bash build/check-apk-version.sh app/build/outputs/apk/release/app-release.apk
|
||||
# -> AndroidManifest versionName = 0.2.0 / versionCode = 200
|
||||
# -> ✓ APK 版本元数据一致:0.2.0(versionCode 200)
|
||||
```
|
||||
|
||||
`build/check_apk_version.py` 直接解析二进制 AXML,**不需要 Android SDK / aapt2**
|
||||
(已与 `aapt2 dump badging` 在 v0.1.0 / v0.2.0 两个真实 APK 上交叉验证逐项一致)。
|
||||
该检查已接入 `build/verify.sh`(步骤 3/3)与 `build/package-release.sh`(打包前 `die`)。
|
||||
|
||||
- [`contracts/websocket-keypoints.md`](contracts/websocket-keypoints.md) - 239 字节关键点帧(本端为**发送方**)
|
||||
- [`contracts/skeleton-topology.md`](contracts/skeleton-topology.md) - MediaPipe 33 点索引与坐标语义
|
||||
- [`contracts/open-source-credits.md`](contracts/open-source-credits.md) - 关于页必须展示的开源声明
|
||||
|
||||
Reference in New Issue
Block a user