-
Notifications
You must be signed in to change notification settings - Fork 0
Home
Starlordzz edited this page Aug 16, 2026
·
3 revisions
落日之后,波纹仍在替我们说着那天没说完的话。
The sun has gone; the ripple hasn't.
这里是 落日后残波(SunsetRipple) 的完整技术文档。项目本体见 README。
一个 Android 近场语音对讲应用:不联网、不过服务器,用手机自带的 WiFi Direct 与经典蓝牙,在最多 6 台设备之间拉起临时语音房。
| 你想做的事 | 去这里 |
|---|---|
| 快速理解整个项目怎么搭的 | 架构总览 |
| 实现一个兼容客户端 / 抓包分析 | 协议规范 |
| 搞清楚该用 WiFi 房还是蓝牙房 | 房间模式对比 |
| 调音质、改码率、理解延迟来源 | 音频管线 |
| 理解房主退出后房间为什么没散 | 房主转移机制 |
| 把源码编译成可安装的包 | 构建与发布 |
| 连不上、没声音、老掉线 | 故障排查 |
| 一般性疑问 | 常见问题 |
新接手这个代码库,按这个顺序读最省力:
-
架构总览 —— 先建立分层心智模型:
ui → session → transport → protocol,以及audio如何横切。 - 协议规范 —— 帧格式是整个系统的中枢,看懂 8 种帧类型就看懂了大半交互。
- 房间模式对比 —— 理解为什么同一套会话层要长出两种截然不同的房间。
- 音频管线 —— 采集、编码、抖动缓冲、混音、播放的完整链路。
- 房主转移机制 —— 全项目最复杂的部分,建议放在最后读。
| 项 | 值 |
|---|---|
| 包名 | host.msknet.sunsetripple |
| 当前版本 |
0.1.0-alpha.3(versionCode 4) |
| 最低系统 | Android 8.0 / API 26 |
| 目标 / 编译 SDK | 35 |
| 语言与 UI | Kotlin 2.0.20 + Jetpack Compose |
| 源码规模 | 59 个主源码 Kotlin 文件 |
| 测试规模 | 37 个测试文件,247 个测试方法,纯 JVM |
| 音频编码 | Opus(Concentus 纯 JVM)16 kHz 单声道 20 ms |
| 房间容量 | 6 台设备(含房主) |
| 许可证 | Apache-2.0 |
-
界面文案全部为简体中文,且硬编码在 Kotlin 中——项目没有
strings.xml,也没有做多语言。 -
没有依赖注入框架、没有数据库、没有网络库——传输层直接用
java.net与android.bluetooth。 - 测试不使用 Robolectric / MockK / Mockito,全部是手写 fake,因此可在纯 JVM 上秒跑。
-
纯决策逻辑一律抽成不依赖 Android 的对象(如
HostElection、RoomFlow、RoomPermissions、BluetoothMixPlanner),这是测试覆盖率能做厚的根本原因。 - 建房转场直接揭示真实房间界面,首页与房间共用落日页头的运动相位和同源配色;不存在动画结束后再切页的第二阶段。
- 房内控制保持轻量:成员轨道、频道核心、静音、扬声器和离开操作按使用频率分层,危险操作不再占据主要视觉位置。