#!/bin/bash # ============================================================ # OpenDance Studio —— APK 版本元数据校验(读产物本身) # # 文档 §11.2 要求「版本号单一来源 + 可核对」。`app/build.gradle.kts` 里的 # `verifyReleaseVersion` 任务只比**构建配置**(versionName ↔ project.yaml); # 而版本号真正被系统与用户看到的地方是 **APK 的 AndroidManifest** —— # 安装界面、应用信息页、`dumpsys package` 读的都是它。 # 构建缓存、复用旧 APK、打包时拷错文件都会让「配置全对、产物是旧版」; # Windows 端 v0.2.1 就踩过同类的坑(配置文件全一致,exe 属性页显示 0.1.0, # 见 opendance-windows/tasks/017-pe-version.md)。 # # 本脚本直接读产物,因此与构建配置无关也能发现漂移。 # # 用法: # bash build/check-apk-version.sh [期望版本 X.Y.Z] # 期望版本缺省时取 project.yaml 的 version;此时同时校验 # versionCode == 10000*主 + 100*次 + 修订(文档 §11.1)。 # ============================================================ set -uo pipefail PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)" cd "$PROJECT_DIR" APK="${1:-}" EXPECTED="${2:-$(sed -n 's/^version:[[:space:]]*//p' project.yaml | head -1)}" if [ -z "$APK" ]; then echo "用法:bash build/check-apk-version.sh [期望版本 X.Y.Z]" >&2 exit 2 fi if [ ! -f "$APK" ]; then echo "✗ 找不到文件:$APK" >&2 exit 2 fi # 解析器只用 Python 标准库读二进制 AXML(不依赖 Android SDK / aapt2)。 # 已用 aapt2 dump badging 在 v0.1.0 与 v0.2.0 两个真实 APK 上交叉验证一致。 PYTHON="${PYTHON_BIN:-}" if [ -z "$PYTHON" ]; then for candidate in python3 python; do if command -v "$candidate" >/dev/null 2>&1; then PYTHON="$candidate"; break; fi done fi if [ -z "$PYTHON" ]; then echo "✗ 未找到 python3(用于解析 APK 内的二进制 AndroidManifest.xml)" >&2 echo " Debian/Ubuntu: apt-get install -y python3" >&2 exit 2 fi if [ -n "$EXPECTED" ]; then "$PYTHON" "$PROJECT_DIR/build/check_apk_version.py" "$APK" --expect-version "$EXPECTED" else "$PYTHON" "$PROJECT_DIR/build/check_apk_version.py" "$APK" fi