Files
ts-mobile-go/docs/implementation/01_项目基础设施.md
T
2026-07-20 19:01:03 +08:00

249 lines
7.4 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.
# 步骤 01:项目基础设施
> 搭建项目骨架、构建系统、依赖配置,确保能编译运行空白应用。
---
## 一、目标
- [x] 建立 Android 项目基本结构
- [x] 配置 Go + gomobile 构建流程
- [x] 集成 teamspeak-go SDK
- [x] 确保能编译生成空白 APK
---
## 二、任务清单
### 2.1 Android 项目结构
**根目录**`android/`(在 IDE 中打开此目录,非仓库根目录)
```
android/
├── build.gradle.kts # 根构建脚本(插件声明)
├── settings.gradle.kts # 项目设置(仓库、模块)
├── gradle.properties # Gradle 属性
├── gradlew / gradlew.bat # Gradle Wrapper
└── app/
├── build.gradle.kts # 应用构建脚本(依赖、SDK 版本)
├── libs/ # gomobile AAR 产物存放处
│ └── teamspeak.aar # Go 编译产物(git ignore
└── src/main/
├── AndroidManifest.xml # 清单文件
└── java/com/tsmobile/app/
├── MainActivity.kt # 入口 Activity
├── TSBridge.kt # Go 桥接封装
└── voice/ # 语音模块(后续步骤扩展)
├── OpusEncoder.kt
├── OpusDecoder.kt
└── VoiceService.kt
```
**关键配置项**
| 配置 | 值 | 说明 |
| --- | --- | --- |
| `namespace` | `com.tsmobile.app` | 包名 |
| `compileSdk` | 35 | Android 15 |
| `minSdk` | 26 | Android 8.0gomobile 要求最低 API 26 |
| `targetSdk` | 35 | 目标 Android 15 |
| `jvmTarget` | 17 | Java 17 |
| `compose` | true | 启用 Jetpack Compose |
**AndroidManifest.xml 权限声明**
```xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
```
- `INTERNET` / `ACCESS_NETWORK_STATE`:连接 TeamSpeak 服务器
- `RECORD_AUDIO`:语音功能(运行时动态申请)
---
### 2.2 Go 模块配置
**目录**`go/`
```
go/
├── go.mod # Go 模块定义
├── go.sum # 依赖校验
├── teamspeak/ # gomobile 导出包(bridge.go 所在)
└── _patches/ # 上游补丁(不可删除)
└── github.com/honeybbq/teamspeak-go/
```
**go.mod 关键内容**
```go
module tsmobile
go 1.26.0
require github.com/honeybbq/teamspeak-go v0.2.0
// 本地补丁替换(必须保留)
replace github.com/honeybbq/teamspeak-go => ./_patches/github.com/honeybbq/teamspeak-go
```
**gomobile 工具声明**go.mod 中):
```go
tool golang.org/x/mobile/cmd/gobind
```
**关键依赖**
| 依赖 | 用途 |
| --- | --- |
| `github.com/honeybbq/teamspeak-go` | TeamSpeak 协议实现 |
| `golang.org/x/mobile` | gomobile 工具链 |
| `golang.org/x/crypto` | 加密支持 |
**本地补丁说明**
`go/_patches/github.com/honeybbq/teamspeak-go/` 包含修改后的上游代码:
- 修复 32 位整数溢出问题(`math.MaxUint32` → 平台相关限制)
- 通过 `go.mod``replace` 指令应用
> ⚠️ **不可删除**此目录或移除 replace 指令,否则编译或运行时会出错。
---
### 2.3 构建脚本
项目提供两个构建脚本,位于仓库根目录:
| 脚本 | 平台 | 说明 |
| --- | --- | --- |
| `build.bat` | Windows | 批处理脚本 |
| `build.sh` | Linux/macOS | Shell 脚本 |
**构建流程分 4 步**
```
[1/4] 检查依赖 → [2/4] 下载 Go 依赖 → [3/4] Go → AAR → [4/4] Android → APK
```
**Step 1:检查依赖**
- 检查 `go` 命令是否可用
- 检查 `gomobile` 是否安装(不存在则自动安装并 init)
- 检查 `ANDROID_HOME` 环境变量
**Step 2:下载 Go 依赖**
```bash
cd go && go mod tidy
```
**Step 3Go → AAR**(核心步骤)
```bash
# Windows 需先设置编码
set JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8
gomobile bind \
-target=android \
-androidapi=26 \
-ldflags="-linkmode=external -extldflags=-Wl,--hash-style=both" \
-o android/app/libs/teamspeak.aar \
./teamspeak
```
**必须的 ldflags**
- `-linkmode=external`:使用 NDK 外部链接器,防止 Go 运行时与 Android 信号处理冲突导致 SIGSEGV
- `-extldflags=-Wl,--hash-style=both`:生成兼容的 ELF 哈希表,防止 `dlopen failed: empty/missing DT_HASH`
**Step 4Android → APK**
```bash
cd android && ./gradlew assembleDebug
```
**输出**`android/app/build/outputs/apk/debug/app-debug.apk`
---
### 2.4 依赖管理
#### Kotlin/Android 依赖(app/build.gradle.kts
**Compose 相关**
| 依赖 | 版本 | 用途 |
| --- | --- | --- |
| `compose-bom` | 2024.12.01 | Compose 版本目录 |
| `material3` | BOM 管理 | Material Design 3 |
| `material-icons-extended` | BOM 管理 | 扩展图标库 |
| `ui-tooling` | BOM 管理 | 调试工具 |
**架构组件**
| 依赖 | 版本 | 用途 |
| --- | --- | --- |
| `activity-compose` | 1.9.3 | Compose Activity 集成 |
| `navigation-compose` | 2.8.5 | 导航框架 |
| `lifecycle-runtime-compose` | 2.8.7 | 生命周期感知 |
| `lifecycle-viewmodel-compose` | 2.8.7 | ViewModel 集成 |
**工具库**
| 依赖 | 版本 | 用途 |
| --- | --- | --- |
| `datastore-preferences` | 1.1.1 | 持久化键值存储(替代 SharedPreferences |
| `kotlinx-coroutines-android` | 1.9.0 | 协程支持 |
| `kotlinx-serialization-json` | 1.7.3 | JSON 序列化 |
**gomobile AAR 引入方式**
```kotlin
implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.aar"))))
```
`teamspeak.aar` 放入 `app/libs/` 目录即可自动引入。
#### Gradle 插件(根 build.gradle.kts
| 插件 | 版本 | 用途 |
| --- | --- | --- |
| `com.android.application` | 8.7.3 | Android 构建 |
| `org.jetbrains.kotlin.android` | 2.1.0 | Kotlin Android 支持 |
| `org.jetbrains.kotlin.plugin.compose` | 2.1.0 | Compose 编译器插件 |
| `org.jetbrains.kotlin.plugin.serialization` | 2.1.0 | 序列化插件 |
---
## 三、验收标准
| # | 验证项 | 验证方法 |
| --- | --- | --- |
| 1 | Go 模块可正常编译 | `cd go && go build ./teamspeak` 无报错 |
| 2 | gomobile 生成 AAR | 运行 `build.bat` / `build.sh` 第 3 步,`app/libs/teamspeak.aar` 存在且大小 > 0 |
| 3 | Android 项目可编译 | `cd android && gradlew.bat assembleDebug` 成功 |
| 4 | 空白 APK 可安装 | 安装 `app-debug.apk` 到设备/模拟器,启动无崩溃 |
| 5 | TSBridge 可调用 | 在 MainActivity 中添加 `TSBridge.isConnected()` 调用,编译通过 |
---
## 四、已完成清单
| 项目 | 状态 | 文件 |
| --- | --- | --- |
| Android 项目结构 | ✅ | `android/` 目录 |
| Gradle 构建配置 | ✅ | `android/build.gradle.kts`, `android/app/build.gradle.kts` |
| AndroidManifest | ✅ | `android/app/src/main/AndroidManifest.xml` |
| Go 模块配置 | ✅ | `go/go.mod` |
| 本地补丁 | ✅ | `go/_patches/` |
| 构建脚本 | ✅ | `build.bat`, `build.sh` |
| TSBridge 封装 | ✅ | `android/app/src/main/java/com/tsmobile/app/TSBridge.kt` |
| VoiceService 骨架 | ✅ | `android/app/src/main/java/com/tsmobile/app/voice/` |
---
## 五、参考文档
- `CLAUDE.md` — 构建命令、关键 flags 说明
- `docs/sdk文档-go.md` — SDK 依赖与 API
- `docs/UI架构设计.md` — 整体架构设计