-
released this
2026-09-14 20:42:02 +08:00 | 23 commits to main since this releaseOpenDance 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 发布,会传递引入
composeanimation-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。使用
- 手机安装 APK(Android 10+)
- 电脑启动 Windows 客户端(自动监听 8765)
- 手机与电脑连同一 WiFi,应用内「扫描局域网」自动发现,或手填 IP
- 点「开始推流」并授予相机权限
若仍闪退:重新打开应用后,连接页顶部会直接显示上次崩溃的完整堆栈
(或用adb logcat -b crash抓取),把它反馈即可继续定位。已知事项
- 未在真实 Android 设备上安装运行(构建环境无设备、无模拟器、无 KVM)。
已验证到:构建通过、签名有效、包信息正确、模型与 native 库正确打包,
以及三个页面在 Robolectric 下真实组合不崩溃。 - 主机发现依赖同一 WiFi;路由器开启 AP 隔离时无法互访。
Downloads