Android 应用内更新 / APK 下载的现代开箱方案
断点续传 · SHA-256 校验 · 速度与剩余时间 · 前台通知 · Compose 演示 · 可直接复用的 download-core
还在用 2017 年的 Retrofit + RxJava 下载 Demo?在 Android 14/15/16 上基本跑不起来。
这个仓库给你一套能学、能抄、能嵌进业务的 2026 基线实现。
喜欢请点个 Star,比喝杯咖啡更解渴 ⭐
很多「下载更新」示例停留在:
- jcenter / 老 Support 库,克隆就编不过
file://安装,Android 7+ 直接崩- 后台 Service 被系统杀,通知没有 Channel
- 明文 HTTP、乱要存储权限,审核和安全都过不去
DownloadApp 把这些坑一次性补齐,并把核心能力抽成独立模块,方便你接到自己的 App 里。
| 你关心的点 | 这里怎么做 |
|---|---|
| 弱网 / 中断 | HTTP Range 断点续传,.part 临时文件 |
| 包被篡改 | 下载完成后 SHA-256 校验,不对绝不装 |
| 用户体验 | 进度、速度、ETA,通知栏可取消 |
| 现代系统 | 前台 dataSync 服务 + FileProvider 安装 |
| 上手成本 | 自带示例清单,不依赖失效的豌豆荚 CDN |
- 断点续传:服务端支持 Range 就接着下,不支持则安全回退整包重下
- 完整性校验:可选 SHA-256,校验失败自动清理脏文件
- 实时反馈:界面 + 通知同步显示进度 / 速度 / 剩余时间
- 失败可恢复:指数退避自动重试,也支持手动重试
- 安全安装:
content://+ 未知来源授权引导,用户主动确认才安装 - 开箱可跑:内置
update-sample.json,克隆即可演示完整流程 - 中英双语:界面字符串已资源化
DownloadApp/
├── download-core/ # 可复用下载库(建议直接依赖或复制)
└── app/ # Compose 演示:检查更新 → 下载 → 安装
flowchart LR
UI[Compose 界面] --> VM[UpdateViewModel]
VM --> Repo[更新清单]
VM --> FGS[前台下载服务]
FGS --> Core[download-core]
Core --> Disk[应用私有目录]
VM --> Install[FileProvider 安装]
环境:JDK 17 · Android SDK 34+ · 支持 Compose 的 Android Studio
# Windows
.\gradlew.bat assembleDebug
# macOS / Linux
./gradlew assembleDebug安装 debug 包后:
- 点 检查更新
- 点 开始下载(默认会下一份 1MB 的 HTTPS 示例文件)
- 把 URL 换成你自己的
.apk,填上 SHA-256,即可走完整安装流程
国内若拉不动 Google Maven,仓库已默认优先走阿里云镜像。
val client = DownloadClient()
val request = DownloadRequest(
url = "https://example.com/app.apk",
destination = File(context.getExternalFilesDir(null), "updates/app.apk"),
expectedSha256 = "你的sha256十六进制",
resume = true,
)
client.download(request).collect { state ->
when (state) {
is DownloadState.Progress -> {
// state.percent / state.speedBytesPerSec / state.etaSeconds
}
is DownloadState.Completed -> {
// 已校验通过,可引导安装
}
is DownloadState.Failed -> {
// state.error.userMessage()
}
else -> Unit
}
}更新清单 JSON 示例:
{
"versionCode": 3,
"versionName": "2.1.0",
"changelog": "1. 修复弱网续传\n2. 增加安装校验",
"downloadUrl": "https://example.com/app.apk",
"sha256": "可选的hex摘要",
"fileSize": 1048576,
"forceUpdate": false
}- 默认 仅 HTTPS,禁止明文流量
- 仓库 不含 签名密码 / keystore(请用本地或 CI Secret)
- 安装必须由用户明确操作触发
- 强烈建议在更新接口下发 SHA-256
| 项 | 值 |
|---|---|
| minSdk | 24 |
| compileSdk / targetSdk | 34(本机装好 Platform 36 后可升到 36,对齐 Play 要求) |
| UI | Jetpack Compose + Material 3 |
| 后台下载 | Foreground Service(dataSync) |
- 多任务队列与并发控制
- Google Play In-App Updates 对照示例
-
download-core发布到 Maven Central
欢迎提 Issue / PR。写清场景和日志,合并会更快。
思路受益于早期下载示例与 DownLoadManager。
- GitHub:@cheng2016
- Email:mitnick.cheng@outlook.com
公共领域(Unlicense)— 详见 LICENSE。商用、改名、闭源封装都可以,记得给个 Star 就很开心。