• v0.1.0 fd50a7fdf3

    zijunchiang released this 2026-09-14 20:42:02 +08:00 | 23 commits to main since this release

    OpenDance Studio — Android 辅助 App v0.1.0

    阶段三交付物:Kotlin + CameraX + MediaPipe 端侧推理。把 33 个骨骼关键点通过
    WebSocket 推给 Windows 客户端。画面不离开设备。

    ⚠ 本次修订修复了一个闪退缺陷:扫描到客户端后点击「开始推流」会立刻闪退。
    附件已更新为修复版本,请重新下载安装。

    缺陷根因与证据

    根因:PoseDetector.initialize() 只写了 catch (Exception)。而 MediaPipe
    初始化失败抛出的是 UnsatisfiedLinkError / NoClassDefFoundError /
    ExceptionInInitializerError —— 这些都属于 Error 而不是 Exception,
    会直接冒泡成进程崩溃。因此只要 MediaPipe 在设备上初始化失败,一进推流页就闪退。

    证据(对照实验):新增 Robolectric 组合测试后,把代码临时改回 catch (Exception):

    改回 catch (Exception):5 项测试 2 项失败
      java.lang.UnsatisfiedLinkError: no mediapipe_tasks_jni in java.library.path
      java.lang.NoClassDefFoundError: Could not initialize class ...PoseLandmarker
    改为 catch (Throwable):5 项全部通过
    

    本次修复与加固

    • PoseDetector / CameraController 全部改为捕获 Throwable,失败只提示不崩溃
    • 移除 accompanist-permissions:0.34.0(2024-02 发布,会传递引入
      compose animation-core:1.6.0,与 Compose BOM 存在版本偏斜风险),
      改用平台 Activity Result API
    • MediaPipe 回调运行在相机线程:所有 Compose 状态写入统一 post 回主线程
    • WebSocket 连接、相机启动、单帧分析全部加失败保护,单帧异常不再中断推流
    • 新增 CrashLogger:未捕获异常落盘到 filesDir/crashes/,
      并在连接页直接展示堆栈 —— 免去连 adb 抓 logcat
    • 新增 Robolectric 组合测试:真实组合连接页/运行页/关于页,
      专门覆盖「进入页面即崩溃」这一类编译期看不出来的缺陷

    验收结果

    单元测试            ✓ 30 / 30 通过(含 5 项 Robolectric 界面组合测试)
    跨端金标准向量      ✓ Kotlin 序列化器与 Web 端 TypeScript 实现逐位一致
    ./gradlew assembleRelease  ✓ 生成已签名 APK(28.6 MB)
    apksigner 校验      ✓ 退出码 0,v2 签名方案
    包信息              ✓ com.opendance.studio v0.1.0,minSdk 29 / targetSdk 34
    模型随包分发        ✓ assets/pose_landmarker_lite.task 5.7 MB(Stored 未压缩)
    ABI                 ✓ arm64-v8a + armeabi-v7a
    

    已排除的可能:Lint 无 NewApi/MissingClass 问题;native 库齐全且全部
    Stored + 4096 对齐(dlopen 不会因对齐失败);LocalLifecycleOwner 等符号
    在 dex 中存在;animation-core 解析为 1.7.5 而非有缺陷的 1.6.0。

    使用

    1. 手机安装 APK(Android 10+)
    2. 电脑启动 Windows 客户端(自动监听 8765)
    3. 手机与电脑连同一 WiFi,应用内「扫描局域网」自动发现,或手填 IP
    4. 点「开始推流」并授予相机权限

    若仍闪退:重新打开应用后,连接页顶部会直接显示上次崩溃的完整堆栈
    (或用 adb logcat -b crash 抓取),把它反馈即可继续定位。

    已知事项

    • 未在真实 Android 设备上安装运行(构建环境无设备、无模拟器、无 KVM)。
      已验证到:构建通过、签名有效、包信息正确、模型与 native 库正确打包,
      以及三个页面在 Robolectric 下真实组合不崩溃。
    • 主机发现依赖同一 WiFi;路由器开启 AP 隔离时无法互访。
    Downloads