Android增量更新(一)-差分文件(Windows-part1)

 

我的视频课程:《FFmpeg打造Android万能音频播放器》

我的视频课程(编码直播推流):《Android视频编码和直播推流》

 

目录:

 

        Android增量更新(一)-差分文件(Windows-part1)

        Android增量更新(二)-差分文件(Windows-part2)-dll动态库和jar包

        Android增量更新(三)-差分文件(Linux)-生成jar和.so库

        Android增量更新(四)-客户端合并差分包生成新的apk安装包

        移动大脑-SpringMVc搭建RestFul后台服务(七)-增量更新    

 

        说到更新软件(apk),最简单的就是检查是否有新版本,有就下载新版本,然后安装就可以了,这可以说是刚学编程的攻城狮都会的。但是随着现在的apk体积越来越大,当用户量多了时,流量成本还是相当可观的,有时新版本只是改了一个文件,然后客户端也需要下载完整的apk来安装,对用户来说也浪费时间和流量,对企业来说也占带宽和支付额外多的流量费。针对这种问题,增量更新就能很大程度的解决这个问题了。

        增量更新乍听感觉是挺高大上的技术,可能只有那些大公司大佬级别的才使用的。其实不然,我们自己也能轻松的为自己的APP实现增量更新(这里也是站在前人的肩膀上,如果自己写还是很难的,算法就难倒了一大堆人)。bsdiffhttp://www.daemonology.net/bsdiff/)就是一个比较好的增量更新库,我们要做的就是将其移植一下然后添加自己的控制语句就可以了。

        bsdiff的原理大致如下:

拆分:bsdiff是对整个文件进行拆分比较的,它会比较旧的文件(小)和新的文件(大)的区别,并将这些区别按照一定的规则保存下来,保存的过程中会用bzip2http://www.bzip.org/)来压缩,使体积尽量小,最终生成一个.patch的差分文件,作用的文件不仅限于apk,其他文件也可以;

合并:APP客户端下载对应.patch文件到本地,然后和本地apk利用进行合并,最终生成新的apk。生成的新的apk和服务器端的apk是完全一样的,这就达到了节省流量的作用了。

那么开始我们的增量更新之旅吧:

一、下载Windows版的bsdiff和bzip源码,不能下载的文末会提供下载地址,解压后目录如下:

 

二、用VS2013(或其他版本)创建一个C++的项目

2.1、创建C++空项目

 

2.2、打开项目位置,在文件中添加include文件夹并复制bsdiff4.3-win32-src中的.h头文件到include文件夹中,方便统一管理:

 

2.3、复制bsdiff4.3-win32-src中的.c/cpp文件到项目目录中:

这里没有复制bspatch.cpp文件,因为它是合并时用到的,拆分时用不到。

 

2.3、右键项目头文件,添加现有项(选择include文件夹里的所有文件)

 

2.4、同理添加源文件

 

 

三、编译项目,并解决编译时出现的问题

3.1、打开bsdiff.cpp文件,发现里面不能找到.h头文件

 

这是因为,头文件被我们添加到了include文件夹里面,这里有2个解决办法:

第一种是:头文件签名都加上include,如:#include "include/bzlib.h",这种方式在头文件比较少的情况下可以使用。

第二种也是我们采用的方式是:右键项目->属性->C/C++->常规->附加包含目录

这样bsdiff.cpp里面就没有报错了

 

3.2、因为一个c/c++项目有且只能有一个main入口,项目中也只有bsdiff.cpp中有main函数,其他文件都没有,所以我们可以直接编译试试

 

这时运行报错了,因为VS中调用了不安全的函数strcat,所以检查报错了。但是根据提示我们能看到解决办法:

 

解决:右键项目->属性->C/C++->命令行 添加“-D _CRT_SECURE_NO_WARNINGS”,就能解决这个问题。

 

3.3、再运行项目,此时还报错,是应为VS默认开启了STL检查的,关闭掉就可以了。

右键项目->属性->C/C++->常规->SDL检查(否)

 

3.4、最后再运行项目就可以了

 

运行后界面一闪而过,此时VS已经为我们生成了BsDiffYwl5320.exe可执行文件,打开目录运行BsDiffYwl5320.exe

 

四、测试差分包

4.1、准备旧包(app_old1.apk)和新包(app_new1.apk)

 

4.2、命令行执行BsDiffYwl5320.exe

分析bsdiff.cpp的main文件可以看到这句代码:

 

if(argc!=4) errx(1,"usage: %s oldfile newfile patchfile\n",argv[0]);

需要传递4个参数,第一个参数是运行文件自己的名字(和shell脚本一样);第二个参数是:旧的文件;第三个参数是:新的文件;第四个参数是:生成的差分包,所以命令应该是这样的:

 

 

BsDiffYwl5320.exe app_old1.apk app_new1.apk app_patch1.patch

运行结果如下:

 

 

 

成功生成了差分包app_patch1.patch。

 

4.3、验证生成的patch包是否正确,用bsdiff4.3-win32-src\Release自带的bsdiff.exe生态.patch包,然后求我们自己生成的.patch包和bsdiff.exe生成的.patch包的MD5是否一样,一样说明就是正确的了。

 

 

 

 

我们可以看到的生成的.patch包MD5完全一致,说明我们的程序时对了的。

 

本来想把windows版本的增量更新写完,但是写到这里发现已经写了很多了,只好分为2次来写了,下一篇将生成.dll动态库给Java(或其他服务端程序)调用,并打包成.jar库,就能直接使用了。

 

源码下载:Github BsDiffYwl5320

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ywl5320

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值