Skip to content
Starlordzz edited this page Aug 16, 2026 · 3 revisions

落日后残波 · Wiki

落日之后,波纹仍在替我们说着那天没说完的话。

The sun has gone; the ripple hasn't.

这里是 落日后残波(SunsetRipple) 的完整技术文档。项目本体见 README。

这是什么

一个 Android 近场语音对讲应用:不联网、不过服务器,用手机自带的 WiFi Direct 与经典蓝牙,在最多 6 台设备之间拉起临时语音房。

按需求找页面

你想做的事 去这里
快速理解整个项目怎么搭的 架构总览
实现一个兼容客户端 / 抓包分析 协议规范
搞清楚该用 WiFi 房还是蓝牙房 房间模式对比
调音质、改码率、理解延迟来源 音频管线
理解房主退出后房间为什么没散 房主转移机制
把源码编译成可安装的包 构建与发布
连不上、没声音、老掉线 故障排查
一般性疑问 常见问题

建议阅读顺序

新接手这个代码库,按这个顺序读最省力:

  1. 架构总览 —— 先建立分层心智模型:ui → session → transport → protocol,以及 audio 如何横切。
  2. 协议规范 —— 帧格式是整个系统的中枢,看懂 8 种帧类型就看懂了大半交互。
  3. 房间模式对比 —— 理解为什么同一套会话层要长出两种截然不同的房间。
  4. 音频管线 —— 采集、编码、抖动缓冲、混音、播放的完整链路。
  5. 房主转移机制 —— 全项目最复杂的部分,建议放在最后读。

关键事实速查

项 值
包名 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),这是测试覆盖率能做厚的根本原因。
  • 建房转场直接揭示真实房间界面,首页与房间共用落日页头的运动相位和同源配色;不存在动画结束后再切页的第二阶段。
  • 房内控制保持轻量:成员轨道、频道核心、静音、扬声器和离开操作按使用频率分层,危险操作不再占据主要视觉位置。

相关链接

Clone this wiki locally