Files
opendance-android/project.yaml
T
zijunchiang c207e7dadd test(accept): 发布包级端到端验收(读 zip 内 APK)+ T-AND-014
`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 仍全绿。
2026-09-17 04:51:16 +08:00

97 lines
3.0 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 契约版本