Files
ts-mobile-go/docs/implementation/00_实施总览.md
T
2026-07-20 19:01:03 +08:00

112 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 实施总览
> 本文档是 TeamSpeak Android 客户端实施计划的主索引,将设计文档拆分为可执行的实施步骤。
> 依据:`docs/sdk-bridge-api.md`、`docs/UI架构设计.md`、`docs/流程/`
---
## 〇、已完成工作
| 阶段 | 状态 | 说明 |
| --- | --- | --- |
| Go 层能力封装 | ✅ 完成 | `go/teamspeak/bridge.go` 已封装全部 SDK 能力,gomobile 编译为 AAR |
| Bridge 层实现 | ✅ 完成 | `TSBridge.kt` 单例直接包装 gomobile 导出的 `TSClient`,提供 Kotlin 友好 API |
**当前架构**
```
Go SDK (teamspeak-go) → gomobile → AAR → TSBridge.kt (应用层桥接,单例)
```
**事件流**Go goroutine → JNI callbackGo goroutine 线程)→ TSBridge → ViewModel → StateFlow → UI
详见 [sdk-bridge-api.md](../sdk-bridge-api.md)。
---
## 一、实施步骤索引
| 步骤 | 文档 | 主要内容 | 对应流程 | 依赖步骤 | 状态 |
| --- | --- | --- | --- | --- | --- |
| 01 | [项目基础设施](01_项目基础设施.md) | 项目结构、构建系统、依赖配置 | — | — | ✅ |
| 02 | [Bridge 层实现](02_Bridge层实现.md) | TSBridge → TsClient 桥接、事件监听 | — | 01 | ✅ |
| 03 | [服务器配置页](03_服务器配置页.md) | 连接 UI、输入验证、最近连接 | 01 连接服务器 | 02 | ⬚ |
| 04 | [连接与首次同步](04_连接与首次同步.md) | 连接流程、Identity、首次同步 | 01 + 08① | 03 | ⬚ |
| 05 | [频道列表页](05_频道列表页.md) | 频道树渲染、成员列表、未读指示 | 02 浏览频道 | 04 | ⬚ |
| 06 | [频道切换](06_频道切换.md) | 频道切换流程、密码弹窗、ClientMove | 03 切换频道 | 05 | ⬚ |
| 07 | [聊天页](07_聊天页.md) | 消息列表、发送消息、消息归档 | 04 文本消息 | 06 | ⬚ |
| 08 | [语音通信](08_语音通信.md) | PTT 按钮、Opus 编码、语音发送/接收 | 05 语音通信 | 06 | ⬚ |
| 09 | [断开连接](09_断开连接.md) | 主动断开、被动断开、被踢处理 | 07 断开连接 | 08 | ⬚ |
| 10 | [状态同步进阶](10_状态同步进阶.md) | 增量同步、补偿同步、重连全量同步 | 08 状态同步 ②③⑥ | 09 | ⬚ |
| 11 | [卡片与全局交互](11_卡片与全局交互.md) | 服务器详情卡、频道详情卡、语音卡、Poke | UI架构 三、四 | 10 | ⬚ |
| 12 | [主题与收尾](12_主题与收尾.md) | 暗色主题、边缘情况、稳定性 | — | 11 | ⬚ |
| 13 | [EventBus 架构](../流程/09_EventBus架构.md) | TS 事件与渲染线程分离、事件合并/节流 | — | 02 | ⬚ |
---
## 二、实施原则
1. **先跑通最小闭环**:连接 → 同步 → 显示频道 → 切换频道 → 发消息 → 断开
2. **每步可验证**:每个步骤完成后应能在真机或模拟器上运行并验证核心功能
3. **Bridge 层已完成**Go ↔ Kotlin 通信已通过 `TsClient` 封装,后续步骤直接调用
4. **状态管理清晰**:严格遵循流程文档中的状态树和事件依赖
5. **UI 后于逻辑**:先确保数据流正确,再打磨 UI 细节
---
## 三、技术栈确认
| 层级 | 技术 | 说明 |
| --- | --- | --- |
| 协议层 | Go + teamspeak-go | 编译为 AAR,通过 gomobile 绑定 |
| Kotlin 封装层 | TSBridge (单例) | 直接包装 gomobile TSClientJSON 传递复杂数据 |
| 桥接层 | TSBridge (单例) | 直接包装 gomobile TSClientJNI 回调转 EventBus 事件 |
| 事件总线 | EventBus (单例) | 事件收集、合并、节流,TS 线程与渲染线程分离 |
| UI 层 | Kotlin + Jetpack Compose | Material Design 3 主题 |
| 状态管理 | ViewModel + StateFlow | 单向数据流,通过 EventBus 接收 TS 事件 |
| 音频 | Opus 编解码 | Android MediaCodec 或第三方库 |
| 网络 | UDP (SDK) + TCP (文件传输) | SDK 内部处理 |
---
## 四、文件结构预期
```
android/app/src/main/java/com/tsmobile/app/
├── MainActivity.kt # 入口
├── TSBridge.kt # 应用层桥接(直接包装 gomobile TSClient
├── EventBus.kt # 事件总线(TS 事件收集、合并、分发)
├── data/ # 数据模型
│ ├── Models.kt # 频道、成员、消息等数据类
│ └── Repository.kt # 状态仓库
├── voice/ # 语音服务
│ ├── VoiceService.kt # 音频管线(采集、编码、解码、播放)
│ ├── OpusEncoder.kt # Opus 编码器
│ └── OpusDecoder.kt # Opus 解码器
├── ui/
│ ├── theme/ # Material 3 主题
│ ├── components/ # 可复用组件
│ └── screens/
│ ├── ServerConfigScreen.kt
│ ├── ChannelListScreen.kt
│ └── ChatScreen.kt
└── viewmodel/
├── ServerViewModel.kt # 连接生命周期(监听 Connected/Disconnected/Kicked
├── ChannelViewModel.kt # 频道列表(监听 ClientEnter/Leave/Moveddebounce 刷新)
├── ChatViewModel.kt # 消息归档(监听 TextMessage
└── VoiceViewModel.kt # 语音控制(VoiceService 直接处理,不经 EventBus
```
---
## 五、风险与注意事项
1. **gomobile 限制已解决**`TSBridge.kt` 直接包装 gomobile 导出的 `TSClient`,通过 JSON 字符串传递复杂数据
2. **线程安全**Go JNI 回调在 Go goroutine 线程上执行(非 Android 主线程),通过 `EventBus.emit()` 统一投递,ViewModel 在 `Dispatchers.Main` 上消费事件
3. **事件合并**:高频成员变化事件(ClientEnter/Leave/Moved)通过 debounce 合并,避免事件风暴导致频繁 refreshClientList
4. **Opus 编解码**SDK 不内置,需应用层集成(`voice/OpusEncoder.kt``voice/OpusDecoder.kt`
5. **语音延迟敏感**VoiceData 不经过 EventBus,由 VoiceService 在 Dispatchers.IO 上直接处理
6. **文件传输**:本文档范围暂不实现(见流程 06 说明)
7. **Identity 管理**:首次生成后需持久化存储
8. **TSBridge 是全局单例**:同一时间只能有一个活跃连接