RetroHttp(二) — 下载支持增量更新

前言

RetroHttp库是我创建的一个主要用于方便网络通讯的库,将长期维护。
此篇文章的记录大家可以参考以下相关知识进行理解。
RetroHttp(一) — 下载使用介绍
JNI 教程
Android增量更新(一)—原理
Android增量更新(二)—制作合成文件so库
Android增量更新(三)—代码实现

今天涉及的知识有:

  1. RetroHttp下载安装方法的使用
  2. 差分&合成 文件
  3. 增量更新的几个疑问解答

一. 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 增量更新失败排查问题

若差分文件下载成功,合成文件失败,手机界面显示在安装软件界面并由弹出框提示:解析包安装错误。请检查代码中合成新文件时的旧包路径,新包路径及差分文件路径是否错误。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • 0. 前言 如果只学理论,不做实践,不踩踩坑,一般很难发现真正实践项目中的问题的,也比较难以加深对技术的理解。所以...
    LouisLau_6d51阅读 1,816评论 0 7
  • 1.概述 1.1.什么是应用增量更新 当我们要更新一个应用的时候,以前很多更新的做法是下载一个新版本去覆盖一个旧版...
    揚灵阅读 3,031评论 8 19
  • @[增量更新,差分包,bsdiff/patch] 背景 随着Android app的不断迭代升级,功能越来越多,a...
    SunYo阅读 13,638评论 2 7
  • 注:首发地址 0. 前言 如果只学理论,不做实践,不踩踩坑,一般很难发现真正实践项目中的问题的,也比较难以加深对技...
    cfanr阅读 9,375评论 4 51
  • 12月18号,早晨醒来洗完脸,我突然就发现左眼里面有个异物。感觉好像一个玻璃渣。我拼命用自来水冲洗,可是怎么都洗不...
    拭去心灵的尘埃阅读 313评论 4 9