前言
RetroHttp
库是我创建的一个主要用于方便网络通讯的库,将长期维护。
此篇文章的记录大家可以参考以下相关知识进行理解。
RetroHttp(一) — 下载使用介绍
JNI 教程
Android增量更新(一)—原理
Android增量更新(二)—制作合成文件so库
Android增量更新(三)—代码实现
今天涉及的知识有:
- RetroHttp下载安装方法的使用
- 差分&合成 文件
- 增量更新的几个疑问解答
一. RetroHttp下载安装方法的使用
当涉及到apk文件下载和安装的时候,你可以类似这样:
//是否增量更新的标志
private boolean mUpdate=false;
private void updateApk(){
String url=null;
//此处mUpdate你要先根据业务逻辑赋值为true或false
if(mUpdate){
//增量更新的url
url="https://xxxx/xxx/test.patch";//示例代码
}else{
//全量更新的url
url="https://xxxx/xxx/test_2.0.0.apk";//示例代码
}
LogUtil.i("=========mUpdate======"+mUpdate);
LogUtil.i("=========url======"+url);
int firstIndex=url.lastIndexOf("/")+1;
int lastIndex=url.length();
String fileName=url.substring(firstIndex,lastIndex);
LogUtil.i("=========fileName======"+fileName);
//启动下载
ProgressDialog progressDialog = DownLoadHelper.getInstance().showDownLoading(mContext);
DownLoadHelper.getInstance().setFileName(fileName)//设置下载文件名
.setIcon(R.mipmap.ic_launcher)//设置apk图标资源id
.setAuthorityTag("com.p.atestdemo")//设置要与清单文件的 provider 中配置的authorities值一致
.setIncrementUpdate(mUpdate)//是否开启增量更新(true:开启,false:关闭,此行代码不设置会默认全量更新)
.downLoadFile(url, MainActivity.this, new DownLoadHelper.DownloadListener() {
@Override
public void onStart() {
}
@Override
public void update(int progress, boolean done) {
progressDialog.setProgress((int) (progress * 1f));
}
@Override
public void onCompleted() {
progressDialog.dismiss();
}
@Override
public void onError(String err) {
progressDialog.dismiss();
LogUtil.i("=========下载失败====="+err);
if(DownLoadHelper.getInstance().isDeltaFileFailed(err)){
LogUtil.i("=========增量更新下载失败====="+err);
//增量更新下载失败的逻辑(一般发rx通知出来,然后改全量更新)
//......
}else{
LogUtil.i("=========全量更新下载失败====="+err);
//全量更新下载失败的逻辑(一般提示退出app)
//......
}
}
});
}
这样,就可以下载新的apk文件进行安装了。不过在调用这个下载方法前,我们最好先判断下手机内存是否足够。
二. 差分&合成 文件
2.1 生成差分文件和合成新文件的工具
本库increment_update
文件夹下是增量更新相关工具文件,包括以下几个文件夹
bsdiff-4.3 差分工具
bzip2-1.0.6 差分工具依赖库
bspatch(so+jar) 实现增量更新的so+jar包
bsdiff-win-master windows版差量工具
这里前三个文件夹供大家学习之用,了解就好。主要看bsdiff-win-master
文件夹 bsdiff-win-master
文件夹下主要看bsdiff-v4.3-win-x64.zip
压缩包 将bsdiff-v4.3-win-x64.zip
解压出来,里面有两个exe
可执行文件,可在windows 64位
系统上运行:
bsdiff.exe 生成差分文件的工具
bspatch.exe 合成新文件的工具
利用以上两个exe
工具,然后结合cmd
命令,就可以生成差分文件
和合成新文件
了
2.2 生成差分文件和合成新文件的依赖库
除了可以用本库的差分工具生成差分文件和合成新文件,你也可以用增量更新库实现文件的差分和合成。具体可参考增量更新库
三.增量更新的几个疑问解答
3.1 增量更新库的实现方式
实现增量更新功能时,最好是建立JNI
项目,利用 native+cmake
的方式实现功能,然后发布成库供引用(类似增量更新库
的操作),而不要用so+jar
的方式供别人引用,因为so+jar
容易出现ABI架构兼容的问题,似乎so+jar
在后续也步怎么支持了。
3.2 生成差分文件和合成文件的方式
生成差分文件和合成文件的方式有两种:利用上面提供的exe
文件进行差分和合成,利用增量更新库
代码进行差分和合成。这里有个疑问:如果我用增量更新库
实现的增量更新功能,但我生成差分文件文件却是用的exe
工具,那么会不会导致代码合成新文件时出错? 答案是不会,虽然一个是工具,一个是代码,但算法一样。
3.3 获取旧包路径问题
网上参看相关文章,大家在展示增量更新功能的时候,都是新建一个demo,然后将打包好的旧包(test_1.0.apk),新包(test_2.0.apk)和差分文件(test.patch)一起拷贝到sdcard的一个具体路径下,这样,他们测试的时候,就可以直接获取test_1.0.apk,test_2.0.apk和test.patch的绝对路径进行测试了。但是在实际开发过程俄中,都是在代码中直接获取当前安装包运行路径(路径类似/data/app/包名+字符/base.apk)。那么疑问是:生成差分文件是用打包好的test_1.0.apk,而用于合成文件时却是用的旧包的运行路径,会不会导致更新时合成新文件失败? 答案是不会,不用担心,经测试可以完美合成。
3.4 增量更新测试问题
测试的时候,一般是打旧包版本(test_1.0.apk),然后打新包版本(test_2.0.apk),用这两个包生成差分文件(test.patch),最后将test.patch上传到服务器。 重点来了,测试的时候,不是直接在androidstudio中运行test_1.0版本的代码来测试增量更新,而应该是用已经打包好的旧包版本(test_1.0.apk)来测试这项功能。
3.5 增量更新失败排查问题
若差分文件下载成功,合成文件失败,手机界面显示在安装软件界面并由弹出框提示:解析包安装错误。请检查代码中合成新文件时的旧包路径,新包路径及差分文件路径是否错误。