docs: 消除 Gitea 模棱两可 Unicode 告警(全角标点紧邻 ASCII 时改为半角)
依据 Gitea v1.27.3 modules/charset/escape_stream.go 的判定规则 (analyzeDetectResults:仅当左右相邻字符都不是非 ASCII 时才标记, 且 _common 表恒定生效),把说明文档中会被标记的全角标点 (,:;?!() 等)改为半角,并保证成对括号宽度一致。 中文语境中的全角标点(左右均为中文)保持原样,不动代码与契约语义。
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# T-AND-001 Android Studio 项目骨架
|
||||
|
||||
- **状态**:done
|
||||
- **状态**: done
|
||||
- **依赖**:无
|
||||
|
||||
## 目标
|
||||
@@ -22,9 +22,9 @@ app/src/main/AndroidManifest.xml
|
||||
| 文件 | 说明 |
|
||||
|---|---|
|
||||
| `settings.gradle.kts` / `build.gradle.kts` | AGP 8.7.3 + Kotlin 2.0.21 + Compose 插件 |
|
||||
| `gradle/wrapper/` | Gradle 8.9 wrapper(`./gradlew` 可直接用) |
|
||||
| `app/build.gradle.kts` | minSdk 29 / targetSdk 34;R8、签名、ABI、模型不压缩 |
|
||||
| `app/src/main/AndroidManifest.xml` | 相机 + 网络权限;`usesCleartextTraffic`(局域网明文 WS) |
|
||||
| `gradle/wrapper/` | Gradle 8.9 wrapper(`./gradlew` 可直接用) |
|
||||
| `app/build.gradle.kts` | minSdk 29 / targetSdk 34; R8、签名、ABI、模型不压缩 |
|
||||
| `app/src/main/AndroidManifest.xml` | 相机 + 网络权限;`usesCleartextTraffic`(局域网明文 WS) |
|
||||
| `MainActivity.kt` | 三页状态机导航(连接 / 运行 / 关于) |
|
||||
| `OpenDanceApp.kt` | Application 单例容器 |
|
||||
| `data/AppSettings.kt` | SharedPreferences 设置 |
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# T-AND-002 CameraX 采集
|
||||
|
||||
- **状态**:done
|
||||
- **依赖**:T-AND-001
|
||||
- **状态**: done
|
||||
- **依赖**: T-AND-001
|
||||
|
||||
## 目标
|
||||
|
||||
@@ -17,7 +17,7 @@ app/src/main/java/com/opendance/studio/data/AppSettings.kt
|
||||
|
||||
## 交付物
|
||||
|
||||
`camera/CameraController.kt`:Preview + ImageAnalysis 绑定、分辨率档位、前后摄切换。
|
||||
`camera/CameraController.kt`: Preview + ImageAnalysis 绑定、分辨率档位、前后摄切换。
|
||||
|
||||
## 关键实现
|
||||
|
||||
@@ -31,7 +31,7 @@ app/src/main/java/com/opendance/studio/data/AppSettings.kt
|
||||
|
||||
## 隐私
|
||||
|
||||
相机帧只在内存中流转到推理器,**不落盘、不上传**。离开运行页即 `unbindAll()`,
|
||||
相机帧只在内存中流转到推理器,**不落盘、不上传**。离开运行页即 `unbindAll()`,
|
||||
不在后台占用相机。
|
||||
|
||||
## 验收
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# T-AND-003 MediaPipe Pose 端侧推理
|
||||
|
||||
- **状态**:done
|
||||
- **依赖**:T-AND-002
|
||||
- **状态**: done
|
||||
- **依赖**: T-AND-002
|
||||
|
||||
## 目标
|
||||
|
||||
@@ -17,7 +17,7 @@ app/src/main/java/com/opendance/studio/pose/PoseDetector.kt
|
||||
|
||||
## 交付物
|
||||
|
||||
`pose/PoseDetector.kt` + `app/src/main/assets/pose_landmarker_lite.task`(5.7 MB)。
|
||||
`pose/PoseDetector.kt` + `app/src/main/assets/pose_landmarker_lite.task`(5.7 MB)。
|
||||
|
||||
## 关键实现
|
||||
|
||||
@@ -32,7 +32,7 @@ app/src/main/java/com/opendance/studio/pose/PoseDetector.kt
|
||||
|
||||
## 坐标与镜像语义
|
||||
|
||||
- 发送**未镜像的原始 MediaPipe 坐标**(契约 4)
|
||||
- 发送**未镜像的原始 MediaPipe 坐标**(契约 4)
|
||||
- 是否镜像由帧头 `flags.bit0` 声明,接收端据此决定如何还原
|
||||
- 叠加层绘制时才取 `1 - x`,与前置摄像头预览的镜像观感一致
|
||||
|
||||
@@ -40,7 +40,7 @@ app/src/main/java/com/opendance/studio/pose/PoseDetector.kt
|
||||
|
||||
## 上半身模式
|
||||
|
||||
`upperBodyOnly = true` 时,髋部及以下点置信度置 0 并置 `flags.bit2`,
|
||||
`upperBodyOnly = true` 时,髋部及以下点置信度置 0 并置 `flags.bit2`,
|
||||
接收端会插值。用于带宽/算力不足时降级。
|
||||
|
||||
## 验收
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# T-AND-004 33 点 -> 239 字节帧
|
||||
|
||||
- **状态**:done
|
||||
- **依赖**:T-AND-003(数据结构)、T-AND-001
|
||||
- **状态**: done
|
||||
- **依赖**: T-AND-003(数据结构)、T-AND-001
|
||||
|
||||
## 目标
|
||||
|
||||
@@ -25,7 +25,7 @@ app/src/main/java/com/opendance/studio/model/SkeletonTopology.kt
|
||||
2 1 version u8 = 1
|
||||
3 1 flags u8 bit0 镜像 | bit1 低置信度 | bit2 上半身
|
||||
4 4 frame_id u32 LE
|
||||
8 231 keypoints 33 x 7B:s16 x, s16 y, s16 z, u8 conf
|
||||
8 231 keypoints 33 x 7B:s16 x, s16 y, s16 z, u8 conf
|
||||
合计 239
|
||||
```
|
||||
|
||||
@@ -58,7 +58,7 @@ console.log(buf.toString('hex'));
|
||||
|
||||
- `ByteBuffer.order(LITTLE_ENDIAN)`,避免手动移位出错
|
||||
- 定点换算 `round(v x 32767)` 并 `coerceIn(-32768, 32767)`
|
||||
- 置信度 `round(v x 255)`,阈值 0.5 含端点(`>=`)
|
||||
- 置信度 `round(v x 255)`,阈值 0.5 含端点(`>=`)
|
||||
- 输入超范围时裁剪而非抛异常(相机抖动可能产生轻微越界值)
|
||||
- 并行 FloatArray 存储,30 FPS 循环内零对象分配
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# T-AND-005 WebSocket 推流 + 自动重连
|
||||
|
||||
- **状态**:done
|
||||
- **依赖**:T-AND-004
|
||||
- **状态**: done
|
||||
- **依赖**: T-AND-004
|
||||
|
||||
## 目标
|
||||
|
||||
@@ -17,7 +17,7 @@ app/src/main/java/com/opendance/studio/net/PoseWebSocketClient.kt
|
||||
|
||||
## 交付物
|
||||
|
||||
`net/PoseWebSocketClient.kt`:OkHttp WebSocket 封装 + 状态流 + 统计。
|
||||
`net/PoseWebSocketClient.kt`: OkHttp WebSocket 封装 + 状态流 + 统计。
|
||||
|
||||
## 关键实现
|
||||
|
||||
@@ -25,7 +25,7 @@ app/src/main/java/com/opendance/studio/net/PoseWebSocketClient.kt
|
||||
|--|--|--|
|
||||
| 子协议 | 请求头 `Sec-WebSocket-Protocol: opendance.pose.v1` | 契约 1 |
|
||||
| 二进制帧 | `socket.send(ByteString)` | 契约要求生产链路用二进制 |
|
||||
| 控制帧 | `send(text)`,JSON | hello / stats / bye |
|
||||
| 控制帧 | `send(text)`, JSON | hello / stats / bye |
|
||||
| 自动重连 | 指数退避 1s -> 2s -> 4s... 上限 15s,连接成功即重置 | 避免抖动时打爆对端 |
|
||||
| 非连接态发送 | 直接丢弃并计入 `droppedFrames` | **绝不阻塞相机线程** |
|
||||
| 心跳 | OkHttp `pingInterval(15s)` | 及时发现半开连接 |
|
||||
@@ -37,7 +37,7 @@ app/src/main/java/com/opendance/studio/net/PoseWebSocketClient.kt
|
||||
- **hello**(连接后立即发):protocol / device / appVersion / cameraFacing /
|
||||
targetFps / resolution
|
||||
- **welcome**(收):记录服务端 sessionId
|
||||
- **config**(收):服务端可下发 mirror / targetFps / upperBodyOnly / resolution,
|
||||
- **config**(收):服务端可下发 mirror / targetFps / upperBodyOnly / resolution,
|
||||
通过 `onRemoteConfig` 回调
|
||||
- **stats**(每秒发):fps / dropped / latencyMs / confidenceAvg
|
||||
- **bye**(主动断开时发)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# T-AND-006 连接页 + 主机发现
|
||||
|
||||
- **状态**:done
|
||||
- **依赖**:T-AND-005
|
||||
- **状态**: done
|
||||
- **依赖**: T-AND-005
|
||||
|
||||
## 目标
|
||||
|
||||
@@ -27,7 +27,7 @@ HTTP 端点发现。因此:
|
||||
|
||||
1. 取手机在 WiFi 网的 IPv4 地址(排除 `rmnet*` 蜂窝网卡与 `169.254.*` 链路本地地址)
|
||||
2. 推导 `/24` 网段
|
||||
3. 并发 TCP 探测 `<局域网网段>.1-254:8765`(并发 32、单机超时 300ms)
|
||||
3. 并发 TCP 探测 `<局域网网段>.1-254:8765`(并发 32、单机超时 300ms)
|
||||
4. 以 `Flow` 形式边扫边产出,按延迟升序展示--最快响应的最可能是目标机
|
||||
|
||||
整段扫描约 2~3 秒。
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# T-AND-007 运行页 + 状态指示
|
||||
|
||||
- **状态**:done
|
||||
- **依赖**:T-AND-003 / 005 / 006
|
||||
- **状态**: done
|
||||
- **依赖**: T-AND-003 / 005 / 006
|
||||
|
||||
## 目标
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# T-AND-008 关于页 + 开源声明
|
||||
|
||||
- **状态**:done
|
||||
- **依赖**:T-AND-006
|
||||
- **状态**: done
|
||||
- **依赖**: T-AND-006
|
||||
|
||||
## 目标
|
||||
|
||||
@@ -18,7 +18,7 @@ app/src/main/java/com/opendance/studio/ui/Credits.kt
|
||||
|
||||
## 交付物
|
||||
|
||||
- `ui/Credits.kt`:15 项声明数据(与契约表逐条对应)
|
||||
- `ui/Credits.kt`: 15 项声明数据(与契约表逐条对应)
|
||||
- `ui/AboutScreen.kt`:版本卡片 + 隐私说明 + 可滚动声明列表
|
||||
|
||||
## 内容要点
|
||||
@@ -30,7 +30,7 @@ app/src/main/java/com/opendance/studio/ui/Credits.kt
|
||||
|
||||
## 验收
|
||||
|
||||
`CreditsTest`(JVM 单元测试)断言:
|
||||
`CreditsTest`(JVM 单元测试)断言:
|
||||
条目数 >= 10、文档要求的 10 项全部在列、每条有许可证与 https 链接、
|
||||
已知项目的许可证正确、本端自身依赖(MediaPipe/OkHttp/CameraX/Compose)均在列、
|
||||
项目名不重复、契约版本为 0.1.0。
|
||||
|
||||
+10
-10
@@ -1,7 +1,7 @@
|
||||
# T-AND-009 APK 打包
|
||||
|
||||
- **状态**:done
|
||||
- **依赖**:T-AND-001 ~ 008
|
||||
- **状态**: done
|
||||
- **依赖**: T-AND-001 ~ 008
|
||||
|
||||
## 目标
|
||||
|
||||
@@ -21,7 +21,7 @@ app/build.gradle.kts
|
||||
|
||||
| 文件 | 说明 |
|
||||
|--|--|
|
||||
| `build/gen-keystore.sh` | 生成发布签名密钥库(**不入库**) |
|
||||
| `build/gen-keystore.sh` | 生成发布签名密钥库(**不入库**) |
|
||||
| `build/build-apk.sh` | 构建 + 校验产物(魔数、签名方案) |
|
||||
| `build/verify.sh` | 单元测试 -> 构建 -> 产物校验 一条龙 |
|
||||
|
||||
@@ -30,7 +30,7 @@ app/build.gradle.kts
|
||||
`app/build.gradle.kts` 按优先级读取签名信息:
|
||||
|
||||
```
|
||||
1. keystore.properties(build/gen-keystore.sh 生成,已 gitignore)
|
||||
1. keystore.properties(build/gen-keystore.sh 生成,已 gitignore)
|
||||
2. 环境变量 KEYSTORE_PATH / KEYSTORE_PASSWORD / KEY_ALIAS / KEY_PASSWORD
|
||||
3. 两者都缺失 -> 回退 debug 签名,保证 CI 上 assembleRelease 也能产出已签名 APK
|
||||
```
|
||||
@@ -46,7 +46,7 @@ app/build.gradle.kts
|
||||
4. 生成 app-release.apk
|
||||
```
|
||||
|
||||
## 验收(文档 6.3 T-AND-009)
|
||||
## 验收(文档 6.3 T-AND-009)
|
||||
|
||||
| 验收项 | 结果 |
|
||||
|--|--|
|
||||
@@ -58,17 +58,17 @@ app/build.gradle.kts
|
||||
## 实测产物
|
||||
|
||||
```
|
||||
app-release.apk 55.5 MiB apksigner: Verifies(v2 方案)
|
||||
app-release.apk 55.5 MiB apksigner: Verifies(v2 方案)
|
||||
Signer #1 DN: CN=OpenDance Studio Dev, OU=OpenDance, O=OpenDance Studio, C=CN
|
||||
package: com.opendance.studio versionName 0.1.0
|
||||
minSdk 29(Android 10) targetSdk 34
|
||||
minSdk 29(Android 10) targetSdk 34
|
||||
ABI: arm64-v8a, armeabi-v7a, x86, x86_64
|
||||
assets/pose_landmarker_lite.task 5.7 MB(Stored 未压缩)
|
||||
assets/pose_landmarker_lite.task 5.7 MB(Stored 未压缩)
|
||||
```
|
||||
|
||||
## 环境记录
|
||||
|
||||
- JDK 17(本地安装路径,示例 `<JDK 17 路径>`)
|
||||
- Android SDK:`platforms;android-34`、`build-tools;34.0.0`
|
||||
- JDK 17(本地安装路径,示例 `<JDK 17 路径>`)
|
||||
- Android SDK: `platforms;android-34`、`build-tools;34.0.0`
|
||||
- 构建期修复的问题:`proguard-rules.pro` 缺失导致 R8 配置告警(已补全 keep 规则)、
|
||||
androidTest 的 `androidx.test.runner` 依赖补齐
|
||||
|
||||
Reference in New Issue
Block a user