# 实施总览 > 本文档是 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 callback(Go 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 TSClient,JSON 传递复杂数据 | | 桥接层 | TSBridge (单例) | 直接包装 gomobile TSClient,JNI 回调转 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/Moved,debounce 刷新) ├── 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 是全局单例**:同一时间只能有一个活跃连接