0°

漫谈Android 增量更新

内容预览:
  • 这里,我们借助开源库来解决以上两个问题~
  • 我们已经弄明白增量更行是怎么一回事~
  • 如果你有好的文章想和大家分享,欢迎投稿,直接向我投递即可~

始发于微信公众号: 程序员小乐

漫谈Android 增量更新

分享互联网、技术、情感等干货平台。您还可以向公众号投稿,将自己总结的技术、心得、经验分享给大家。学无止境,不求尽如人意,但求问心无愧。让学习成为一种美、一种习惯。值得爱学习的你去关注,感觉有帮助转发分享让更多的人去关注!点击上方蓝字关注!

作者:江湖人称小白哥

链接:http://blog.csdn.net/dd864140130/article/details/52928419

前言

在前几年,整体移动网络环境相比现在差很多,加之流量费用又相对较高,因此每当我们发布新版本的时候,一些用户升级并不是很积极,这就造成了新版本的升级率并不高。而google为了解决了这个问题,提出了Smart App Update,即增量更新(也叫做差分升级)。

尽管现在网络环境有了很大的提升,但一个不争的事实就是应用越做越大,因此,增量更新在目前的仍然是一种解决APP更新包过大的有效方案。今天,我们就来聊聊增量更新。

什么是增量更新?

增量更新的关键在于如何理解增量一词。来想想平时我们的开发过程,往往都是今天在昨天的基础上修改一些代码,app的更新也是类似的:往往都是在旧版本的app上进行修改。这样看来,增量更新就是原有app的基础上只更新发生变化的地方,其余保持原样。

与原来每次更新都要下载完整apk包的做法相比,这样做的好处显而易见:每次变化的地方总是比较少,因此更新包的体积就会小很多。比如“师父说”安装包的体积在6m左右,如果不采用增量更新,用户每次更新都需要下载大约6m左右的安装包,而采用增量更新这种方案之后每次只需要下载2m左右的更新包即可,相比原来做法大大减少了用户下载等待的时间。

增量更新的原理

增量更新的原理非常简单,简单的说就是通过某种找出新版本和旧版本不一样的地方(这个过程也叫做差分),然后将不一样的地方抽取出来形成所谓的更新补丁(patch),也称之为差分包。客户端在检测到更新的时候,只需要下载差分包到本地,然后将差分包合并至本地的安装包,形成新版本的安装包,文件校验通过后再执行安装即可。本地的安装包通过提取当前已安装应用的apk得到。

演示:差分包的生成与合并

如下图所示: 
漫谈Android 增量更新

现在的问题在于如何生成差分包以及合并差分包。这里,我们借助开源库来解决以上两个问题。首先我们先演示一下差分包的形成与合并。

下载bsdiff_win_exe.zip,解压到本地。如下图: 
漫谈Android 增量更新

然后,我们先打出一个安装包,假设为old.apk。对源码做修改后,再打出一个新的安装包new.apk。此处old.apk相当于老版本的应用,而new.apk相当于新版本的应用。接下来,我们利用bsdiff来生成差分包patch.patch。

生成差分包

将上面的old.apk和new.apk放入bsdiff解压后的目录,然后在控制台中执行命令bsdiff old.apk new.apk patch.patch,稍等一会便可以生成差分包patch.patch,如下

漫谈Android 增量更新

合并差分包

合并old.apk和patch.patch,生成新的安装包new.apk。只要此处合并出来的new.apk和上面我们自己打出来的new.apk一样,那么就可以认为它就是我们需要的新版本安装包。

我们来看看如何合并。将old.apk和patch.patch放入bsdiff文件夹,合并之前为: 
漫谈Android 增量更新

然后执行命令bspatch old.apk new.apk patch.patch,稍等一会之后便可以看到合并出的new.apk.如下: 
漫谈Android 增量更新

不出意外,合并而来的new.apk应该和我们自己打出来的new.apk是一模一样的,这可以通过验证两者的md5来认定。

我们已经弄明白增量更行是怎么一回事。下面,我们就以“师父说”为对象进实践一把。

实践:让师父说支持增量更新

客户端支持增量更新总体和上面的演示差不多,唯一的区别在于客户端要自行编译bspatch.c来实现合并差分包,也就是所谓的ndk开发,这里我们首先要下载bsdiff的源码以及的源码,以便后面使用。在as中如何进行ndk开发不是本文的重点。

1.编写BsPatchUtil类

BsPatchUtil中只有一个natvie方法patch(String oldApkPath,String newApkPath,String patchPath)用于实现增量包的合并:

漫谈Android 增量更新

2.编写C代码

在实现BsPatchUtil之前,我们需要将bspatch.c以及bzip的相关代码拷贝到jni目录下(bzip只保留.h头文件和.c文件)。并将bspatch.c中的main()方法名修改为executePatch(),并且修改其中bzip的引入头为#include "bzip2/bzlib.h".目录结构如下: 


漫谈Android 增量更新

注意:上图当中的em.c是一个空文件,用来避免在window下编译产生的未知错误。

接下来我们就可以在bspatch_util.c中实现相关的代码了:

漫谈Android 增量更新

至此,大部分工作已经完成了。配置app moudle中的build.gradle中添加ndk配置

漫谈Android 增量更新

接下来,我们编译试试(ndk环境的配置这里不做说明,自行配置即可),不出意外会遇到以下错误: 
漫谈Android 增量更新

该问题的解决方法也非常简单,注释掉对应文件的main()方法即可。重新编译,不出意外没什么问题了。接下来,我们就需要在合适的地方合并差分包了。

3.合并差分包

上面的过程做完之后,就可以通过BsPatchUtil.patch()来合并当前安装包和差分包了。

这里,我们假设差分包已经从服务器下载到本地了。

首先来看如何获取当前安装包。我们安装的应用通常在、data/app下,可以通过一下代码获取其路径:

漫谈Android 增量更新

下面就可以通过BsPatchUtil.patch(String oldApkPath,String newApkPath,String pathPath)来进行合并了。此处需要注意两点:

  1. 合并的地方建议放在外置存储(SDcard)当中

  2. 合并的过程比较耗时,需要放到子线程中进行。

4.安装

任何更新包在下载完成后首先要做的就是进行MD5校验,以便确认该更新包是正规途径下载而来的。同样,对于合并之后的更新包,首先要做的事情也是进行MD5校验,校验通过之后,再进行安装:

漫谈Android 增量更新

到现在,增量更新已经完成。现在可以把增量包以及合并之后的安装包进行删除了。

大体代码如下:

漫谈Android 增量更新

漫谈Android 增量更新

增量更新的缺点

增量更新虽让有效的解决了更新包过大的问题,但是存在以下几点问题:

  1. 客户端和服务端需要加入相应的支持。每次发布新版本,服务端都需要为以前所有的老版本生成对应的差分包,并根据客户端端请求返回对应的更新包,维护过程将会变得相对复杂。客户端需要对差分包做更为详细的验证,防止出错,除此之外,客户端应该可以根据服务端更新开关来确定当前是使用完整更新还是增量更新。

  2. apk包之间的差异过小时,比如2m以下,此时生成的差分包仍然有几百k,此时使用增量更新得不偿失,毕竟形成差分包和合并的过程都非常耗时。另外,但版本之间变化非常大的时候,通常是是大版本好变化的时候,比如从v 1.0.0到2.0.0,此时使用完整更新也不错。

在中已经添加主要代码,可自行练习。效果如下: 

漫谈Android 增量更新

如果您觉得不错,请别忘了分享到您的朋友圈让更多的人看到!! 您的举手之劳,就是对我最好的支持,非常感谢!

推荐阅读




大家可以加群和大牛们一起学习,由于“大牛聚集之地、大牛聚集之地2群”已满
如果有人想进群,可以加我的微信,我拉你进群,我的微信:1733563441(请备注:城市-职称-名字)

看完本文有收获?请转发分享给更多人
关注「杨守乐」,提升编程技能

漫谈Android 增量更新

如何关注:

① 长按二维码,选择“识别图中二维码”进行关注。

 点击微信右上角的“+”,会出现“添加朋友”,进入“公众号”,输入公众号的名字,即可找到。

如果你有好的文章想和大家分享,欢迎投稿,直接向我投递即可。
投稿邮箱:
[email protected]/[email protected]
技术社区:
 
【QQ技术群】279126311 [满]
【QQ技术群】484572225 [未]

以上就是:漫谈Android 增量更新 的全部内容。

本站部分内容来源于互联网和用户投稿,如有侵权请联系我们删除,谢谢。
Email:[email protected]


0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论