# 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(各服务地址注册表) └── bugCollectApiUrl / bugCollectEnabled(从平台配置获取) ↓ 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-bugcollect → 日志 / 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-bugcollect(依赖 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 ```