Android:一套组合版全量更新

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 26 天,点击查看活动详情

一个成熟的应用必不可少的东西很多,今天我们说说应用内更新。

APP更新大体分为很多种:全量更新和热更新。常见的应用市场更新其实就是全量更新,相当于重新下载了一个新版本的apk文件进行覆盖安装。而热更新是通过某种技术在两个apk版本取出其差异的部分打成一个补丁包,将这个补丁包发布到服务端下发给客户端,客户端再将这些差异的东西加载出来。

热更新相对全量更新来说实现上相对复杂,需要处理的东西比较多,也会产生各种各样的问题,另外还需要服务端的加持,最让人难以接受的是四大组件还不能进行新增,最多也只能提前注册好供后续有新增需求时使用,往往还是不可取,最后都是通过全量更新来达到目的,所以本篇针对全量更新展开分享。

Bugly—腾讯为移动开发者提供的升级方案

不得不说这是一款良心之作,免费且好用,不仅有热更新和全量更新,还提供了日志收集和运营统计功能,但就在去年10月26日宣布停止更新服务。一时之间很难再找到一款免费的全量更新三方平台。由于之前所有项目都是接入的这个库,届时真的是炸开了锅,情急之下只能用最原始的方式——后端提供API,移动端下载安装。

过程也比较简单,每次打包后将apk上传到服务端。APP打开时请求后端接口,拿到当前服务端apk的最新信息,这里通过versionCode进行判断,再将apk下载到本地安装。此过程涉及到下载文件监听、通知栏、文件校验,说简单也不简单,干脆就在Github上找了一个更新库AppUpdate,目前尚在维护,整体使用下来问题不大。

val result = ApkUtil.deleteOldApk(
    requireContext(),
    "${requireActivity().externalCacheDir?.path}/$apkName"
)
//这里需要提前设置,否则下载进度刚开始会不对
binding.progress.progress = 0
binding.tvProgress.text = "0%"
binding.linProgress.visible(true)
Timber.e("删除旧包:$result")
manager = DownloadManager.Builder(requireActivity()).run {
    apkUrl("url")
    apkName(apkName)
    smallIcon(R.mipmap.ic_logo)
    onDownloadListener(object : OnDownloadListenerAdapter() {
        override fun downloading(max: Int, progres: Int) {
            val curr = (progres / max.toDouble() * 100.0).toInt()
            binding.progress.max = 100
            binding.progress.progress = curr
            binding.tvProgress.text = "$curr%"

            if (curr == 100) {
                manager?.cancel()
                dismiss()
            }
        }
    })
    build()
}
manager?.download()

那么问题来了,如果后端不配合,又该怎么实现呢?

蒲公英开放平台

因为平时内测时都是使用自己在蒲公英注册的账号进行分发,该平台也是免费的,所以就一直使用至今。它有个好处就是提供了简单的api供开发者调用获取当前版本的apk信息,我们不再需要接入任何三方库,这不正是我们需要的吗?

1676619698065.jpg

//获取当前最新apk信息
https://www.pgyer.com/apiv2/app/view
//下载apk地址
https://www.pgyer.com/apiv2/app/install?_api_key={}&buildKey={buildKey}&buildPassword={buildPassword}

此时,我们可以脱离后端,改用蒲公英存放apk,毕竟内测分发也用的它,使用起来也简单,最重要的是免费!好了,以上便是本篇全部内容,希望对大家有所帮助!

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 26 天,点击查看活动详情