首次推送
This commit is contained in:
@@ -0,0 +1,248 @@
|
||||
# 步骤 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.0(gomobile 要求最低 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 3:Go → 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 4:Android → 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` — 整体架构设计
|
||||
Reference in New Issue
Block a user