     效果不能代表真机，不能作为验收依据。联调验收请用真机。

   权限：相机权限为运行时授予；INTERNET / ACCESS_NETWORK_STATE /
   ACCESS_WIFI_STATE 为普通权限，安装时自动授予，用于推流与局域网扫描。

2) 获取代码与本地配置

   git clone https://<Gitea 地址>/<owner>/opendance-android.git
   cd opendance-android

   local.properties 是本地文件（已在 .gitignore 中，不入库），内容：
     sdk.dir=<Android SDK 路径>

   build/build-apk.sh 在缺失时会依据 ANDROID_HOME / ANDROID_SDK_ROOT 自动生成。

   签名材料不入库：仓库只有生成脚本，没有私钥。首次发布前执行
     bash build/gen-keystore.sh
   生成 keystore/opendance-release.jks 与 keystore.properties（含 storeFile、
   keyAlias 与两个口令字段）。请自行备份，且不要提交。
   取值优先级：keystore.properties -> 环境变量（KEYSTORE_PATH /
   KEYSTORE_PASSWORD / KEY_ALIAS / KEY_PASSWORD）-> 回退 debug 签名
   （仅供 CI 产出已签名 APK，正式发布必须自备 keystore）。

3) 首次构建

   export JAVA_HOME=<JDK 17 路径>
   export ANDROID_HOME=<Android SDK 路径>

   bash build/build-apk.sh debug      # 仅 debug
   bash build/build-apk.sh release    # 仅 release
   bash build/build-apk.sh all        # 两者都构建（含产物校验）

   或直接用 Gradle：
   ./gradlew assembleDebug
   ./gradlew assembleRelease

   产物（固定路径）：
     app/build/outputs/apk/debug/app-debug.apk
     app/build/outputs/apk/release/app-release.apk

   发布整包（APK + THIRD_PARTY.md + README.txt + contracts/）：