`build/verify.sh` 验的是 app/build/outputs/ 里**刚构建**的 APK,而用户装的是 zip
里的 app-release.apk。两端都因此翻过车(Web v0.7.4 实体注册、Windows v0.2.1 的
PE 版本元数据),故三端统一:每次发布都要有一条读产物本身的验收(文档 §7.5)。
新增 build/accept-release.sh,对一个 zip(或已解压目录)跑完:
1) sha256(有 SHA256SUMS 时);
2) 解压 + 文件清单(apk / README.txt / THIRD_PARTY.md / contracts/VERSION);
3) APK 的 AndroidManifest versionName/versionCode = 发布版本(复用
check-apk-version.sh —— 安装界面与应用信息页读的就是它);
4) ABI 恰为 arm64-v8a + armeabi-v7a、无模拟器 ABI,且两个 ABI 下都有
MediaPipe native 库(T-AND-012 崩溃根因之一);
5) assets/pose_landmarker_lite.task 在包内;dex 里仍有
poselandmarker/PoseLandmarker(R8 没整体裁掉);
6) 有 apksigner 时顺带验签;
7) 包内 contracts/VERSION 与仓库逐项一致(抓「APK 用旧契约构建、快照拷了新的」)。
package-release.sh 结尾打印下一步验收命令;README 补用法。
实测(对**已发布**的 v0.2.0 资产重新下载后跑):sha256 OK、版本元数据 0.2.0/200、
ABI 恰为两个真机 ABI、两个 ABI 下都有 MediaPipe native、模型资源在、dex 命中
PoseLandmarker、apksigner 通过、契约快照与仓库一致 → 发布包级验收全部通过。
反向验证(真实负例):
* 篡改包内 contracts/VERSION 的 data-models=0.6.0 →
✗ data-models:包内 0.6.0,仓库 0.7.0,退出码 1;
* 期望版本写 0.2.1 对 v0.2.0 的包 → ✗ versionName 是 '0.2.0',期望 '0.2.1'
且 ✗ versionCode 是 200,期望 201。
诚实声明:**装到真机跑 30 分钟**这条脚本替代不了,仍属设备实测项;本脚本能证明的是
「装得上、不会因打包配置而崩」。verify.sh 仍全绿。
97 lines
3.0 KiB
YAML
97 lines
3.0 KiB
YAML
project: opendance-android-app
|
||
version: 0.2.0
|
||
repository: opendance-android
|
||
default_branch: main
|
||
platform: Android 10+(minSdk 29 / targetSdk 34)
|
||
contracts_version:
|
||
rest-api: 0.5.0
|
||
websocket-keypoints: 0.2.0
|
||
data-models: 0.7.0
|
||
skeleton-topology: 0.2.0
|
||
model-formats: 0.5.0
|
||
database: 0.4.0
|
||
|
||
# 契约变更流程(文档 7.2):
|
||
# 任何跨端契约变更必须先在 opendance-web 修改 contracts/ 并提升版本,
|
||
# 再在本项目创建适配任务。本项目内的 contracts/ 只是只读快照。
|
||
|
||
dependencies:
|
||
- name: opendance-windows
|
||
kind: websocket-producer
|
||
contract: contracts/websocket-keypoints.md
|
||
usage: 本端为**发送方**,主动连接 Windows 客户端的 ws://<host>:8765/pose
|
||
- name: opendance-web
|
||
kind: contract-source
|
||
contract: contracts/skeleton-topology.md
|
||
usage: 33 点索引顺序与坐标语义(MediaPipe 原生顺序即契约顺序)
|
||
|
||
tasks:
|
||
- id: T-AND-001
|
||
file: tasks/001-scaffold.md
|
||
scope: Android Studio 项目骨架
|
||
status: done
|
||
- id: T-AND-002
|
||
file: tasks/002-camera-x.md
|
||
scope: CameraX 采集
|
||
status: done
|
||
- id: T-AND-003
|
||
file: tasks/003-mediapipe-pose.md
|
||
scope: MediaPipe Pose 端侧推理
|
||
status: done
|
||
- id: T-AND-004
|
||
file: tasks/004-keypoint-serializer.md
|
||
scope: 33 点 -> 239 字节帧
|
||
status: done
|
||
- id: T-AND-005
|
||
file: tasks/005-websocket-client.md
|
||
scope: WebSocket 推流 + 自动重连
|
||
status: done
|
||
- id: T-AND-006
|
||
file: tasks/006-connect-ui.md
|
||
scope: 连接页 + 主机发现
|
||
status: done
|
||
- id: T-AND-007
|
||
file: tasks/007-running-ui.md
|
||
scope: 运行页 + 状态指示
|
||
status: done
|
||
- id: T-AND-008
|
||
file: tasks/008-about-page.md
|
||
scope: 关于页 + 开源声明
|
||
status: done
|
||
- id: T-AND-009
|
||
file: tasks/009-build-apk.md
|
||
scope: Android Studio 打包
|
||
status: done
|
||
- id: T-AND-010
|
||
file: tasks/010-about-version.md
|
||
scope: 「关于」清单展示当前版本号 + 契约版本单一来源
|
||
status: done
|
||
- id: T-AND-011
|
||
file: tasks/011-reconnect.md
|
||
scope: 连接状态机 / 保活 / 去重与 Windows 端对齐
|
||
status: done
|
||
- id: T-AND-012
|
||
file: tasks/012-mediapipe-crash.md
|
||
scope: MediaPipe 初始化崩溃修复 + 诊断
|
||
status: done
|
||
- id: T-AND-013
|
||
file: tasks/013-apk-version.md
|
||
scope: APK 产物版本元数据(AndroidManifest 的 versionName/versionCode)校验 + 打包脚本 die 未定义修复
|
||
status: done
|
||
- id: T-AND-014
|
||
file: tasks/014-release-acceptance.md
|
||
scope: 发布包级端到端验收(读 zip 内 APK:版本元数据 / ABI+MediaPipe native / 模型资源 / R8 / 契约快照)
|
||
status: done
|
||
|
||
deliverable:
|
||
artifact: opendance-android-v0.2.0.apk
|
||
packaging: Gradle 命令行 / Android Studio
|
||
includes:
|
||
- app-release.apk
|
||
- THIRD_PARTY.md
|
||
- README.txt
|
||
- contracts/ # 契约快照
|
||
release_rules:
|
||
- release 包只含 arm64-v8a / armeabi-v7a(真机 ABI)
|
||
- 版本号单一来源:versionName(= project.yaml 的 version)与 BuildConfig 契约版本
|