Skip to content

Repository files navigation

DownloadApp

Android 应用内更新 / APK 下载的现代开箱方案

断点续传 · SHA-256 校验 · 速度与剩余时间 · 前台通知 · Compose 演示 · 可直接复用的 download-core

Android CI License: Unlicense Kotlin minSdk

还在用 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 安装]
Loading

3 分钟跑起来

环境:JDK 17 · Android SDK 34+ · 支持 Compose 的 Android Studio

# Windows
.\gradlew.bat assembleDebug

# macOS / Linux
./gradlew assembleDebug

安装 debug 包后:

  1. 检查更新
  2. 开始下载(默认会下一份 1MB 的 HTTPS 示例文件)
  3. 把 URL 换成你自己的 .apk,填上 SHA-256,即可走完整安装流程

国内若拉不动 Google Maven,仓库已默认优先走阿里云镜像。


接入你自己的 App(核心就这几行)

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

联系

License

公共领域(Unlicense)— 详见 LICENSE。商用、改名、闭源封装都可以,记得给个 Star 就很开心。

About

下载更新app的一个示例,Retrofit2 + OkHttp + Rxjava2+ Notification + Service实现后台自动更新

Topics

Resources

Contributing

Stars

5 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages