#!/bin/bash # ============================================================ # OpenDance Studio —— Android 辅助 App 一键验证 # # 依次执行:单元测试 → debug 构建 → release 构建 → 产物校验 # 任一环节失败即退出非 0。 # # 用法: # JAVA_HOME=/path/to/jdk17 ANDROID_HOME=/path/to/sdk bash build/verify.sh # ============================================================ set -uo pipefail PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)" cd "$PROJECT_DIR" FAILED=0 echo "============================================================" echo " 1/3 单元测试(JVM,无需设备)" echo "============================================================" if ./gradlew testDebugUnitTest --console=plain -q 2>&1 | tail -20; then echo "✓ 单元测试通过" else echo "✗ 单元测试失败" FAILED=1 fi echo " 测试报告:app/build/reports/tests/testDebugUnitTest/index.html" echo "" echo "============================================================" echo " 2/3 构建 debug + release APK" echo "============================================================" if bash build/build-apk.sh all 2>&1 | grep -vE "^> Task|^$" | tail -20; then : else FAILED=1 fi echo "" echo "============================================================" echo " 3/3 产物校验(签名 / 包信息 / 模型资源)" echo "============================================================" SDK="${ANDROID_HOME:-${ANDROID_SDK_ROOT:-$HOME/Android/Sdk}}" # 优先选用与 compileSdk 匹配的 build-tools,缺失时退回最新版 if [ -d "$SDK/build-tools/34.0.0" ]; then BT="$SDK/build-tools/34.0.0" else BT="$(ls -d "$SDK"/build-tools/* 2>/dev/null | sort -V | tail -1)" fi RELEASE_APK="app/build/outputs/apk/release/app-release.apk" if [ ! -f "$RELEASE_APK" ]; then echo "✗ 未生成 $RELEASE_APK" FAILED=1 elif [ -z "$BT" ]; then echo "✗ 未找到 build-tools,无法校验" FAILED=1 else # 以**退出码**为准:不同 build-tools 版本的 apksigner 输出文案不一致 # (34.0.0 会打印 "Verifies",36.0.0 配 --print-certs 时只打印证书信息), # 依赖日志字符串判断会导致误判。 "$BT/apksigner" verify "$RELEASE_APK" > /tmp/apk_verify.txt 2>&1 VERIFY_STATUS=$? "$BT/apksigner" verify --print-certs "$RELEASE_APK" > /tmp/apk_sign.txt 2>/dev/null if [ "$VERIFY_STATUS" -eq 0 ]; then echo "✓ 签名校验通过(apksigner 退出码 0)" grep -E "Signer #1 certificate DN" /tmp/apk_sign.txt | sed 's/^/ /' || true if grep -q "APK Signature Scheme v2" /tmp/apk_verify.txt 2>/dev/null; then echo " v2 签名方案:已启用" fi else echo "✗ 签名校验失败(apksigner 退出码 $VERIFY_STATUS)" cat /tmp/apk_verify.txt FAILED=1 fi "$BT/aapt2" dump badging "$RELEASE_APK" 2>/dev/null | head -1 | sed 's/^/ /' if unzip -l "$RELEASE_APK" | grep -q "assets/pose_landmarker_lite.task"; then echo "✓ MediaPipe 模型已随包分发" else echo "✗ APK 中缺少 MediaPipe 模型" FAILED=1 fi ABIS=$(unzip -l "$RELEASE_APK" | grep -oE "lib/[^/]+/" | sort -u | tr '\n' ' ') echo "✓ 包含 ABI:$ABIS" fi echo "" if [ "$FAILED" -ne 0 ]; then echo "============================================================" echo " 验证失败" echo "============================================================" exit 1 fi echo "============================================================" echo " 验证全部通过" echo "============================================================"