写在前面
欢迎大家关注我的公众号:牛角尖尖上起舞
Github上优秀的版本更新框架很多,推荐大家去阅读去使用,我就从中受益良多。
有这么多优秀的版本更新框架了,我为什么还要造轮子呢?
有这么几方面考虑:
1、这些优秀的版本更新框架,基本都规定了版本更新接口的交互细节,包括提交的参数、返回的数据及其格式等。
这就要求server端的接口要随着app端选用的版本更新框架的不同而调整,这就不大合适了。
2、写这个库的初衷是要用于公司内部的几个app,便于app端统一风格,server端统一接口,还是自己造的轮子更方便定制和改版了。
3、想要尽量精简库的体积,尽量去除无用代码。
github源码地址:https://github.com/ZuoHailong/AppUpdate (文后附的还有链接)
示例
功能介绍
-
支持指向apk文件的 url 形式的版本更新
-
支持指向接口、接口返回二进制文件流的 url 形式的版本更新
-
支持断点下载
-
采用 Service + AsyncTask 方式下载
-
提供界面友好的版本更新提示弹窗,可自定义其主题样式
-
兼容Android 6.0,更新库自动获取写权限,用户拒绝后可再次请求
-
兼容Android 7.0,支持FileProvider
-
兼容Android 8.0,应用安装无障碍
-
实现国际化(支持中文和英文)
用法
具体的 gradle 依赖、API 用法等,github上有详述,请移步:
https://github.com/ZuoHailong/AppUpdate
注意:使用者需自行访问自己项目的版本更新接口,获取版本更新内容、新版本名、新版本下载链接等,然后才能调用此库实现版本更新。此库提供的功能主要是弹框、下载、安装等。
实现
版本更新提示框
AppUpdateManager 是此库的入口,在其中采用 Builder 模式对版本更新进行初始化,并调起版本更新框。支持 “建议更新” 或 “必须更新” 。
此库提供的所有API都集中在 AppUpdateManager.Builder 中。
代码很浅显,这里就不贴了,想要看的访问 Github 好了。
下载
-
下载采用的方式是 Service + AsyncTask,做了断点下载的支持;
-
应用的下载支持常见的直接指向文件的以 “.apk” 结尾的url的形式
-
应用的下载还支持接口直接返回文件流的形式。
需要注意的是,这种方式,文件大小是必须设置的,是否支持断点下载则是由server端小伙伴决定的,并需要在builder时进行设置:
builder.updateForce(boolean isForce)
-
兼容了 Android 6.0,可自动获取 “存储写入” 权限,用户拒绝的话,会在用户下次点击 “立即更新” 时再次申请权限。除非必要,使用者不需要再关心 “存储写入” 的权限问题;
-
AsyncTask中使用了 okHttp 库进行下载,目前用的是 okHttp 的最新版 4.0.0 。后面也许会考虑移除 okHttp 库,使用自己的代码进行下载,以便进一步缩减此库体积。
注:这一块的代码,有受益于郭霖大神的书《第一行代码(第2版)》。
安装
安装的重点是要做 Android 7.0 和 Android 8.0 的兼容,也就是在 7.0 上要处理 FileProvider 的问题,在 8.0 上要处理 “安装未知来源应用” 权限的问题,即:
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission
android:name="android.permission.INSTALL_PACKAGES"
tools:ignore="ProtectedPermissions" />
短期内更新计划
-
建议更新模式下,在更新提示框中显示下载进度,且app不可用的处理方式似乎不大合适,改为 “ 更新提示框消失,在通知栏中显示下载进度,不影响app使用,下载完成后自动调起安装页面 ” 会更加友好一些;
-
okHttp 库的引用移除,用自己的代码实现 apk 的断点下载。
项目源码在 github 上,并提供了 demo 供测试使用:https://github.com/ZuoHailong/AppUpdate
感谢
郭霖:https://blog.youkuaiyun.com/guolin_blog
薛翔的开源库XUpdate:https://github.com/xuexiangjys/XUpdate
千匍的开源库AppUpdate:https://github.com/WVector/AppUpdate
欢迎大家关注我的公众号:牛角尖尖上起舞