docs: 消除 Gitea 模棱两可 Unicode 告警(全角标点紧邻 ASCII 时改为半角)

依据 Gitea v1.27.3 modules/charset/escape_stream.go 的判定规则
(analyzeDetectResults:仅当左右相邻字符都不是非 ASCII 时才标记,
且 _common 表恒定生效),把说明文档中会被标记的全角标点
(,:;?!() 等)改为半角,并保证成对括号宽度一致。
中文语境中的全角标点(左右均为中文)保持原样,不动代码与契约语义。
This commit is contained in:
opendance
2026-09-15 21:45:51 +08:00
parent ab88231ea0
commit 68783c37b6
18 changed files with 147 additions and 147 deletions
+4 -4
View File
@@ -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 设置 |
+4 -4
View File
@@ -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()`,
不在后台占用相机。
## 验收
+5 -5
View File
@@ -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`,
接收端会插值。用于带宽/算力不足时降级。
## 验收
+4 -4
View File
@@ -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 循环内零对象分配
+5 -5
View File
@@ -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**(主动断开时发)
+3 -3
View File
@@ -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 秒。
+2 -2
View File
@@ -1,7 +1,7 @@
# T-AND-007 运行页 + 状态指示
- **状态**:done
- **依赖**:T-AND-003 / 005 / 006
- **状态**: done
- **依赖**: T-AND-003 / 005 / 006
## 目标
+4 -4
View File
@@ -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
View File
@@ -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` 依赖补齐