|
|
# OnlineMsg Android Client (Kotlin + Compose)
|
|
|
|
|
|
本目录是针对当前 `OnlineMsgServer` 协议实现的 Android 客户端。
|
|
|
|
|
|
## 主要能力
|
|
|
|
|
|
- Kotlin + Jetpack Compose + Material3
|
|
|
- 与当前服务端协议兼容:
|
|
|
- 首包 `publickey` 握手(明文)
|
|
|
- `publickey` challenge-response 鉴权(签名)
|
|
|
- `broadcast` / `forward` 消息发送(签名 + 防重放字段)
|
|
|
- 消息体 RSA-OAEP-SHA256 分块加解密(190/256)
|
|
|
- Android Keystore 生成并持久化客户端 RSA 密钥
|
|
|
- 状态管理:`ViewModel + StateFlow`
|
|
|
- 本地偏好:`DataStore`(用户名、服务器地址、模式、系统消息开关)
|
|
|
- 易用性:
|
|
|
- 广播/私聊一键切换
|
|
|
- 消息复制
|
|
|
- 我的公钥查看与复制
|
|
|
- 服务器地址保存/删除
|
|
|
- 状态提示与诊断信息
|
|
|
|
|
|
## 工程结构
|
|
|
|
|
|
- `app/src/main/java/com/onlinemsg/client/ui`:UI、ViewModel、状态模型
|
|
|
- `app/src/main/java/com/onlinemsg/client/data/crypto`:RSA 加密、签名、nonce
|
|
|
- `app/src/main/java/com/onlinemsg/client/data/network`:WebSocket 封装
|
|
|
- `app/src/main/java/com/onlinemsg/client/data/preferences`:DataStore 与地址格式化
|
|
|
- `app/src/main/java/com/onlinemsg/client/data/protocol`:协议 DTO
|
|
|
|
|
|
## 运行方式
|
|
|
|
|
|
1. 使用 Android Studio 打开 `android-client` 目录。
|
|
|
2. 等待 Gradle Sync 完成。
|
|
|
3. 运行 `app`。
|
|
|
|
|
|
命令行构建示例:
|
|
|
|
|
|
```bash
|
|
|
cd android-client
|
|
|
./gradlew assembleDebug
|
|
|
```
|
|
|
|
|
|
## 联调地址建议
|
|
|
|
|
|
- 模拟器建议地址:`ws://10.0.2.2:13173/`
|
|
|
- 真机建议地址:`ws://<你的局域网IP>:13173/`
|
|
|
- 若服务端启用 WSS,需要 Android 设备信任对应证书。
|
|
|
|
|
|
### Debug 本地 CA 信任
|
|
|
|
|
|
如果你使用 `deploy` 目录生成的局域网自签名证书做 `wss://` 联调,debug 构建可以额外信任一张本地 CA:
|
|
|
|
|
|
- 把 CA 证书放到仓库根目录的 `deploy/certs/android-local/local_ca.crt`
|
|
|
- `deploy/certs/` 已在 `.gitignore` 中,这张证书只用于本地调试,不应提交到 Git
|
|
|
- 执行 `./gradlew assembleDebug` 时,构建脚本会自动生成 debug-only 的 `networkSecurityConfig`
|
|
|
- 如果该文件不存在,debug 仍然可以编译,只是不会额外信任本地 CA
|
|
|
|
|
|
推荐把局域网部署生成的 `local_ca.crt` 放到这个位置,再连接 `wss://<你的局域网IP>:13173/`
|
|
|
|
|
|
## 协议注意事项
|
|
|
|
|
|
- 鉴权签名串:
|
|
|
- `publickey\n{userName}\n{publicKey}\n{challenge}\n{timestamp}\n{nonce}`
|
|
|
- 业务签名串:
|
|
|
- `broadcast|forward\n{key}\n{payload}\n{timestamp}\n{nonce}`
|
|
|
- `forward` 的 `key` 必须是目标公钥。
|
|
|
- `broadcast` 的 `key` 为空字符串。
|
|
|
|
|
|
## 构建产物导出(可选)
|
|
|
|
|
|
- `assembleDebug` 结束后会触发 `exportDebugApk` 任务,把 `app-debug.apk` 复制到导出目录。
|
|
|
- 默认导出目录:`android-client/app/build/exports/apk-debug`
|
|
|
- 可通过以下方式覆盖导出目录:
|
|
|
- Gradle 属性:`-PdebugApkExportDir=/your/path`
|
|
|
- 环境变量:`DEBUG_APK_EXPORT_DIR=/your/path`
|
|
|
|
|
|
## 已知限制
|
|
|
|
|
|
- 当前未内置证书固定(pinning);如用于公网生产,建议额外启用证书固定策略。
|