2026-05-02 22:57:55 +08:00
|
|
|
|
# Android 版本更新接入指南
|
|
|
|
|
|
|
|
|
|
|
|
**模块**:`com.xuqm:sdk-update` · **功能**:App 版本检查、下载安装
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 1. 添加依赖
|
|
|
|
|
|
|
|
|
|
|
|
```kotlin
|
|
|
|
|
|
// app/build.gradle.kts
|
|
|
|
|
|
dependencies {
|
|
|
|
|
|
implementation("com.xuqm:sdk-update:0.4.0")
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 2. 检查更新
|
|
|
|
|
|
|
|
|
|
|
|
```kotlin
|
|
|
|
|
|
import com.xuqm.sdk.update.UpdateSDK
|
|
|
|
|
|
|
|
|
|
|
|
// 在协程中调用
|
|
|
|
|
|
lifecycleScope.launch {
|
|
|
|
|
|
val update = UpdateSDK.checkAppUpdate(context)
|
|
|
|
|
|
if (update?.needsUpdate == true) {
|
|
|
|
|
|
println("发现新版本: ${update.versionName}")
|
|
|
|
|
|
println("更新日志: ${update.changeLog}")
|
|
|
|
|
|
println("下载地址: ${update.downloadUrl}")
|
|
|
|
|
|
|
|
|
|
|
|
if (update.forceUpdate == true) {
|
|
|
|
|
|
// 强制更新:必须升级后才能使用
|
|
|
|
|
|
showForceUpdateDialog(update)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 可选更新:提示用户
|
|
|
|
|
|
showOptionalUpdateDialog(update)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 3. 下载并安装
|
|
|
|
|
|
|
|
|
|
|
|
```kotlin
|
|
|
|
|
|
lifecycleScope.launch {
|
|
|
|
|
|
UpdateSDK.downloadAndInstall(context, downloadUrl) { progress ->
|
|
|
|
|
|
// 更新下载进度 0-100
|
|
|
|
|
|
updateProgressBar(progress)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
`downloadAndInstall` 内部会:
|
|
|
|
|
|
1. 下载 APK 到外部存储目录
|
|
|
|
|
|
2. 通过 `FileProvider` 获取文件 URI
|
|
|
|
|
|
3. 启动系统安装界面
|
|
|
|
|
|
|
|
|
|
|
|
**需提前配置 `FileProvider`**:
|
|
|
|
|
|
|
|
|
|
|
|
```xml
|
|
|
|
|
|
<!-- AndroidManifest.xml -->
|
|
|
|
|
|
<provider
|
|
|
|
|
|
android:name="androidx.core.content.FileProvider"
|
|
|
|
|
|
android:authorities="${applicationId}.fileprovider"
|
|
|
|
|
|
android:exported="false"
|
|
|
|
|
|
android:grantUriPermissions="true">
|
|
|
|
|
|
<meta-data
|
|
|
|
|
|
android:name="android.support.FILE_PROVIDER_PATHS"
|
|
|
|
|
|
android:resource="@xml/file_paths" />
|
|
|
|
|
|
</provider>
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
```xml
|
|
|
|
|
|
<!-- res/xml/file_paths.xml -->
|
|
|
|
|
|
<?xml version="1.0" encoding="utf-8"?>
|
|
|
|
|
|
<paths>
|
|
|
|
|
|
<external-files-path name="updates" path="." />
|
|
|
|
|
|
</paths>
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 4. 强制更新处理
|
|
|
|
|
|
|
|
|
|
|
|
当服务端返回 `forceUpdate = true` 时,建议业务层:
|
|
|
|
|
|
|
|
|
|
|
|
1. 弹出不可取消的对话框
|
|
|
|
|
|
2. 只允许用户点击「立即更新」
|
|
|
|
|
|
3. 下载完成后自动调用安装
|
|
|
|
|
|
|
|
|
|
|
|
```kotlin
|
|
|
|
|
|
fun showForceUpdateDialog(update: UpdateInfo) {
|
|
|
|
|
|
AlertDialog.Builder(context)
|
|
|
|
|
|
.setTitle("发现重要更新")
|
|
|
|
|
|
.setMessage("当前版本已不可用,请升级至 ${update.versionName}")
|
|
|
|
|
|
.setCancelable(false)
|
|
|
|
|
|
.setPositiveButton("立即更新") { _, _ ->
|
|
|
|
|
|
lifecycleScope.launch {
|
|
|
|
|
|
UpdateSDK.downloadAndInstall(context, update.downloadUrl!!) { progress ->
|
|
|
|
|
|
// 显示下载进度
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
.show()
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 5. 多模块统一登录
|
|
|
|
|
|
|
|
|
|
|
|
Update 模块与 IM、Push 模块共享同一套登录态:
|
|
|
|
|
|
|
|
|
|
|
|
```kotlin
|
|
|
|
|
|
XuqmSDK.login(userId = "user_001", userSig = "jwt_token")
|
|
|
|
|
|
// UpdateSDK 在 checkAppUpdate 时自动携带 appKey,无需额外登录操作
|
|
|
|
|
|
```
|
2026-05-03 00:11:06 +08:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 6. 一键打包上传
|
|
|
|
|
|
|
|
|
|
|
|
SDK 提供 `xuqmRelease` Gradle 任务,可一键完成 Release 构建并上传至 XuqmGroup 版本管理服务:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
./gradlew xuqmRelease
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
任务执行流程:
|
|
|
|
|
|
1. 执行 `assembleRelease` 构建 Release APK
|
|
|
|
|
|
2. 自动提取版本号、versionCode、更新日志
|
|
|
|
|
|
3. 上传 APK 到 XuqmGroup 后台
|
|
|
|
|
|
4. 返回发布结果
|
|
|
|
|
|
|
|
|
|
|
|
如需自定义配置,在 `app/build.gradle.kts` 中添加:
|
|
|
|
|
|
|
|
|
|
|
|
```kotlin
|
|
|
|
|
|
xuqmRelease {
|
|
|
|
|
|
releaseNotesFile = file("CHANGELOG.md")
|
|
|
|
|
|
forceUpdate = false
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|