docs(sdk): 添加 Android SDK 架构总览文档
- 新增架构总览文档,包含整体架构图和依赖关系 - 详细描述初始化流程(ContentProvider 自动和手动两种方式) - 补充技术栈版本信息和发布说明 - 更新服务器端和Web端项目上下文文档 - 添加新模块 xuqm-log-service 的版本文件 - 在服务器端 POM 中注册 xuqm-log-service 模块 - 修复 Android SDK 字符串模板语法错误 - 修改服务器端 webhook 服务的 Redis 锁获取逻辑
这个提交包含在:
父节点
4a18d06c63
当前提交
b25a27c9f6
107
docs/架构总览.md
普通文件
107
docs/架构总览.md
普通文件
@ -0,0 +1,107 @@
|
|||||||
|
# XuqmGroup Android SDK 架构总览
|
||||||
|
|
||||||
|
## 整体架构
|
||||||
|
|
||||||
|
```
|
||||||
|
宿主 App(YwxMobileApp 等)
|
||||||
|
└── 初始化(方式A: ContentProvider 自动 / 方式B: Application.onCreate 手动)
|
||||||
|
↓
|
||||||
|
sdk-core(核心层)
|
||||||
|
├── XuqmSDK.initialize() → 拉取 /api/sdk/config
|
||||||
|
├── XuqmSDK.setUserInfo() → 通知所有子模块(反射 / 接口回调)
|
||||||
|
├── ApiClient(OkHttp 5 + Retrofit 3)
|
||||||
|
├── TokenStore(EncryptedSharedPreferences)
|
||||||
|
├── FileSDK(上传 / 下载 / 打开文件)
|
||||||
|
├── ServiceEndpointRegistry(各服务地址注册表)
|
||||||
|
└── logApiUrl / logEnabled(从平台配置获取)
|
||||||
|
↓ implementation dep
|
||||||
|
子模块
|
||||||
|
├── sdk-update → APK 更新 / 版本检查
|
||||||
|
├── sdk-push → 厂商推送(FCM/HMS/VIVO/OPPO/Honor/APNs)
|
||||||
|
├── sdk-im → IM(WebSocket/STOMP 实时通信)
|
||||||
|
├── sdk-webview → WebView + JSBridge(Compose 组件)
|
||||||
|
├── sdk-license → 证书授权
|
||||||
|
└── sdk-log → 日志 / Crash 捕获 / 漏斗分析(依赖 sdk-core)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 依赖关系
|
||||||
|
|
||||||
|
```
|
||||||
|
sdk-core (核心,无 SDK 内部依赖)
|
||||||
|
↑ implementation dep
|
||||||
|
├── sdk-update (依赖 sdk-core)
|
||||||
|
├── sdk-push (依赖 sdk-core)
|
||||||
|
├── sdk-im (依赖 sdk-core)
|
||||||
|
├── sdk-webview (依赖 sdk-core)
|
||||||
|
├── sdk-license (依赖 sdk-core)
|
||||||
|
└── sdk-log (依赖 sdk-core)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 用户状态分发
|
||||||
|
|
||||||
|
```
|
||||||
|
XuqmSDK.setUserInfo(info)
|
||||||
|
├── PushSDK: 检测厂商 → 注册 token → 上报服务端
|
||||||
|
├── ImSDK: 若 userSig 存在且 imEnabled → 自动登录 WebSocket
|
||||||
|
├── UpdateSDK: 更新 userId
|
||||||
|
└── LicenseSDK: 更新用户上下文
|
||||||
|
|
||||||
|
XuqmSDK.setUserInfo(null)
|
||||||
|
├── PushSDK: 解绑 token
|
||||||
|
├── ImSDK: 断开 WebSocket
|
||||||
|
└── 其他子模块: 清理用户状态
|
||||||
|
```
|
||||||
|
|
||||||
|
## 初始化流程
|
||||||
|
|
||||||
|
### 方式 A(ContentProvider 自动)
|
||||||
|
|
||||||
|
```
|
||||||
|
App 启动
|
||||||
|
↓
|
||||||
|
XuqmInitializerProvider.onCreate()
|
||||||
|
↓ 读取 assets/xuqm/config.xuqm
|
||||||
|
ConfigFileReader.read(context)
|
||||||
|
↓ 解析 appKey + serverUrl
|
||||||
|
XuqmSDK.initialize(context, appKey, serverUrl)
|
||||||
|
↓ HTTP GET
|
||||||
|
/api/sdk/config → 返回 { apiUrl, imWsUrl, fileServiceUrl, ... }
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方式 B(手动)
|
||||||
|
|
||||||
|
```
|
||||||
|
Application.onCreate()
|
||||||
|
↓
|
||||||
|
XuqmSDK.initialize(context, appKey = "xxx")
|
||||||
|
↓ HTTP GET
|
||||||
|
/api/sdk/config → 解析平台配置
|
||||||
|
↓
|
||||||
|
各子模块就绪(等待 setUserInfo 触发具体功能)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 技术栈
|
||||||
|
|
||||||
|
| 组件 | 版本 |
|
||||||
|
|------|------|
|
||||||
|
| Kotlin | 2.3.10 |
|
||||||
|
| AGP | 9.1.0 |
|
||||||
|
| minSdk | 24 |
|
||||||
|
| compileSdk | 36 |
|
||||||
|
| Java | 21 |
|
||||||
|
| OkHttp | 5.x |
|
||||||
|
| Retrofit | 3.x |
|
||||||
|
| Coroutines | 1.x |
|
||||||
|
|
||||||
|
## 发布
|
||||||
|
|
||||||
|
发布到 Nexus Maven:`https://nexus.xuqinmin.com/repository/android-hosted/`
|
||||||
|
groupId:`com.xuqm`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 发布所有模块
|
||||||
|
./gradlew publish
|
||||||
|
|
||||||
|
# 发布单个模块
|
||||||
|
./gradlew :sdk-core:publish -PSDK_CORE_VERSION=1.0.0
|
||||||
|
```
|
||||||
@ -217,7 +217,7 @@ object XuqmSDK {
|
|||||||
private fun platformInitException(platformUrl: String, appKey: String, cause: Throwable): Throwable {
|
private fun platformInitException(platformUrl: String, appKey: String, cause: Throwable): Throwable {
|
||||||
val kind = if (platformUrl == DEFAULT_PLATFORM_URL) "公有平台" else "私有化平台 $platformUrl"
|
val kind = if (platformUrl == DEFAULT_PLATFORM_URL) "公有平台" else "私有化平台 $platformUrl"
|
||||||
return IllegalStateException(
|
return IllegalStateException(
|
||||||
"XuqmSDK 初始化失败:无法从$kind获取服务配置(appKey=$appKey)。" +
|
"XuqmSDK 初始化失败:无法从${kind}获取服务配置(appKey=$appKey)。" +
|
||||||
"私有化与公有平台互相独立,不自动降级。原因:${cause.message}",
|
"私有化与公有平台互相独立,不自动降级。原因:${cause.message}",
|
||||||
cause
|
cause
|
||||||
)
|
)
|
||||||
|
|||||||
正在加载...
在新工单中引用
屏蔽一个用户