
最近刚刚做完ReactNative基于微软的CodePush进行热更新,可是发现一个问题就是,如果每次更新太慢,一个原因可能是微软的CodePush的服务器在国外,那么如何不依赖微软的CodePush服务器实现增量更新呢?看另一篇博客ReactNative之增量升级方案,这里主要针对如何实现增量补丁的打包,以及如何将增量包和旧包合并成新包,通过bsdiff技术实现,下面针对Mac、iOS和Android三个平台进行一一讲解。
bsdiff介绍
bsdiff是一种二进制差分工具,有bsdiff和bspatch组成,将oldfile和newfile做二进制数据差分(即bsdiff操作),得到更新部分(patch文件),再与oldfile进行合并(bspatch操作)成newfile。

废话不多说,先撸一遍代码再说。
Mac下使用bsdiff
- 打开终端安装bsdiff
1 | $ brew install bsdiff |
- 使用bsdiff生成xxx.patched补丁文件
1 | $ bsdiff ./Desktop/test/hot_old.zip ./Desktop/test/hot_new.zip ./Desktop/test/hot.patched |

- 使用bspatch生成新包文件
1 | # 注意这里的文件路径 |

- 验证生成的新包是否正确,通过md5值是否相同,相同则生成正确
1 | $ md5 ./Desktop/test/hot_new.zip |
iOS使用bsdiff进行文件资源增量更新(bsdiff/bspatch)
下载bsdiff bzip2文件
- bsdiff下载链接:http://www.daemonology.net/bsdiff/
- bzip2下载链接:https://sourceforge.net/projects/bzip2/
iOS集成(xcode10.2)
- 新建一个工程,将下载好的bsdiff、bzip2导入工程中,大致内容如下

- 编译工程,会报如下错误,意料之中,大致原因是因为存在相同的main函数,我们只需要按照提示一步一步修改方法名字就可以了。

解决办法如下,这里只演示修改一个文件

- 在编译发现除了main函数重名以外,还有一个错误如下所示

解决办法如下:我们查看bzip2.c
和bzip2recover.c
,搜索progName
字段,发现又是重名了,那么修改即可,这里不做演示,本项目是将bzip2recover.c
文件的progName
改为progNameRecover
- 再次编译,恭喜你编译成功了~,不成功你找我。
- 因为bsdiff为C语言编写,oc引用c语言,需要新建一个.h文件,在.h文件中引用bsdiff.c和bspatch的方法(该方法名是我讲main方法改名后的方法名)

- 并且还需要在
bsdiff.c
和bspatch.c
文件中#include "BsdiffTool.h"
- 下面进行本地测试,我们本地创建两个文件夹,大致内容如下,然后打包成zip,然后拖入工程中

- 调用bsdiff方法,生成补丁包patch,项目命名为
hot_bsdiff
1 | /** |
此时运行项目,你会发现document路径下会出现一个hot_bsdiff
文件,这个文件就是oldfile和newfile文件二进制差分出来的文件,也就是需要更新的文件,但是这个文件不能直接使用,需要我们通过bspatch方法合成新的zip文件。
- 调用bspatch方法,将hot_old.zip + hot_bsdiff(patch增量包) 生成新包hot_new.zip,项目命名为
hot_bspatch_new.zip
1 | /** |
运行项目,在对应路径下,就会看到hot_bspatch_new.zip
文件,此时解压次安装包,内容如下

至此iOS集成bsdiff完成。
android使用bsdiff
后续更新
参考链接
- bsdiff和bspatch热更新方案:https://yq.aliyun.com/articles/74390
- iOS使用bsdiff进行资源文件增量更新:https://www.jianshu.com/p/3c58760079d9