     App 运行页  「连接状态」为「已连接」，「目标」显示 ws://<IP>:<端口>/pose
     App 运行页  服务端返回 welcome 后出现「会话」ID
     App 运行页  「已发送」持续增长，「发送帧率」「识别帧率」大于 0
     App 运行页  「人体识别」为「已识别」，出现骨架叠加（黄点好、红点置信度低）
     Windows 端  显示已连接并收到关键点，VRM 模型随动作实时动起来

7) 自检清单

   ./gradlew testDebugUnitTest
     预期：BUILD SUCCESSFUL，全部用例通过
     报告：app/build/reports/tests/testDebugUnitTest/index.html

   bash build/build-apk.sh all
     预期：debug 与 release 均显示 "OK ... APK"，release 显示
           "已签名（APK Signature Scheme v2）"

   $ANDROID_HOME/build-tools/34.0.0/apksigner verify app/build/outputs/apk/release/app-release.apk
     预期：退出码 0（无输出即通过）

   adb install -r app/build/outputs/apk/debug/app-debug.apk
     预期：Success

8) 常见问题

   Q: 相机黑屏 / 一直提示需要相机权限
   A: 权限被拒绝或已被永久拒绝，或相机被其他应用占用。在运行页点
      「授予相机权限」；不再弹窗时到系统「设置 -> 应用 -> OpenDance -> 权限」
      手动开启相机，并关闭占用相机的其它 App。

   Q: 连不上 Windows 客户端 / 扫描不到主机
   A: 核对 IP 与端口、确认客户端已启动并监听 8765、在 Windows 防火墙放行
      OpenDance 的 TCP 8765 入站、确认手机与电脑同一 WiFi 且路由器未开 AP 隔离。

   Q: 点「开始推流」闪退（或提示 MediaPipe 初始化失败）
   A: MediaPipe 原生库加载 / 静态初始化失败抛出的是 Error 子类
      （UnsatisfiedLinkError、ExceptionInInitializerError），不是 Exception；
      常见诱因是 ABI 不匹配（例如把只含 arm 的 release 包装到 x86 模拟器）
      或模型资源缺失。处理：改用与设备 ABI 匹配的包（真机用 release、
      模拟器调试用 debug）；确认 APK 内含 assets/pose_landmarker_lite.task。
      仓库已在 PoseDetector.initialize() 中 catch Throwable 兜底并把原因显示在
      运行页；CrashLogger 会把未捕获堆栈写入应用私有目录，并在连接页展示，