基于bsDiff拆分模式所做的资源包的热部署热更新

项目场景:

`最近项目中 有一个新的需求 本来我开发的app一些基于webview所作的网页静态资源 需要本地化到系统中 这样可以少消耗网络带宽以及流量 基于这个场景 引出了资源包的更新机制问题 emmm更新这玩意贼麻烦 因为你所持有的资源包 什么资源都有 接口的返回json文件 图片啊 视频啊 什么什么的 贼烦。那么有没有一种可以囊括所有文件格式 并做到更新的方式呢 有那就是基于二进制算法的bsdiff拆分形式。

原理

二进制这个东西 相信大家都不陌生 我们接触的所有文件格式 其实在计算机内部 都是二进制的编码 比如图片 就是在开头定义了图片的宽高 如果你用记事本的形式打开图片 然后删除前面一些部分 图片是不是打不开了 还真是 但是呢 你如果删除的是后半部分 那么你的图片还是能打开的 只是只会展示一半 应该大概也许不止我一个人这么干过吧虾h(~ ̄▽ ̄)~ 一前闲着无聊 咳咳廉颇老矣啊( *︾▽︾)

准备

需要的开源文件

这里我把需要用到的代码和工具都整理了一下放到了一起:https://www.aliyundrive.com/s/ALCxbGeWY2o在这里插入图片描述
bzip2:是bsdiff依赖的一个库,这里我只存放了需要用到的文件,完整版的下载地址为:https://sourceforge.net/projects/bzip2/files/latest/download
bsdiff-win:是编译好的Windows平台下的可执行文件,可以在Windows平台生成差异文件和合并文件
bsdiff-source:是bsdiff的源码,它的官网为:http://www.daemonology.net/bsdiff/

工具的使用方式

只需要在工具所在的目录打开命令行窗口
在这里插入图片描述

然后输入命令即可

#生成差异文件命令
bsdiff [旧文件] [新文件] [差异文件]
#合并文件命令
bspatch [旧文件] [新文件] [差异文件]
#生成差异文件命令
bsdiff [旧文件] [新文件] [差异文件]
#合并文件命令
bspatch [旧文件] [新文件] [差异文件]

例如我这创建两个文本文件old.txt和new.txt
old.txt
new.txt


在这里插入图片描述
在这里插入图片描述

然后我可以利用bsdiff命令生成差异文件

在这里插入图片描述
然后你就会看到我们生成出来的拆分包
在这里插入图片描述

这个时候我再利用bspatch命令,将old.txt和patch文件合成new2.txt。咳咳忽略俺打错的字
在这里插入图片描述
然后这个是时候 你看看 是不是就会有两个最新的文件一个new.txz/new2.txt
在这里插入图片描述
我们打开new2.txt发现与new.txt是一样的,瞅瞅是不是一毛一样
new2.txt

在这里插入图片描述

代码:

好 相信看到这里 大家也懂这个东西是干嘛的了 又怎么用的了吧 相对于这些 大家肯定还是想看的如何使用代码来进行这些操作!

集成

1.集成bspatch到项目
由于Android端只需要合并文件所以我们只需要集成bspatch即可,我们将bsdiff-source/bsdiff-4.3文件夹中的bspatch.c文件拷贝到cpp目录,然后将bzip2文件夹下的文件拷贝到cpp下的bzip(新建的目录)目录下
在这里插入图片描述
此外我们还要对bspatch.c进行修改,我们在文件顶部加入bzip2的引用

/** 导入bzip2的引用*/
#include "bzip/bzlib.c"
#include "bzip/crctable.c"
#include "bzip/compress.c"
#include "bzip/decompress.c"
#include "bzip/randtable.c"
#include "bzip/blocksort.c"</
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: bsdiff是一个用来生成和应用差异的程序,它可以用来将一个旧版本的文件和一个新版本的文件的差异打成一个差异,然后再用这个差异来更新旧版本的文件,从而得到新版本的文件。 要封装一个基于C语言的bsdiff库,可以这样: 1. 下载bsdiff的源代码:https://github.com/mendsley/bsdiff 2. 将bsdiff的源代码放到工程目录中 3. 在工程的CMakeLists.txt文件中,添加bsdiff的源文件到工程中 4. 在代码中bsdiff.h头文件,然后就可以使用bsdiff库了。 下面是一个使用bsdiff库生成差异的示例代码: ``` #include "bsdiff.h" int main(int argc, char *argv[]) { // 检查命令行参数 if (argc != 4) { fprintf(stderr, "Usage: %s oldfile newfile patchfile\n", argv[0]); return 1; } // 打开文件 FILE *oldfile = fopen(argv[1], "rb"); if (oldfile == NULL) { perror("Error opening old file"); return 1; } FILE *newfile = fopen(argv[2], "rb"); if (newfile == NULL) { perror("Error opening new file"); return 1; } FILE *patchfile = fopen(argv[3], "wb"); if (patchfile == NULL) { perror("Error opening patch file"); return 1; } // 调用bsdiff库生成差异 int result = bsdiff(oldfile, newfile, patchfile); if (result != 0) { fprintf(stderr, "Error generating patch\n"); return 1; } // 关闭文件 fclose(oldfile); fclose(newfile); fclose(patchfile); return 0; } ``` ### 回答2: bsdiff 是一个基于C的库,用于生成和应用二进制差分文件。下面是一个封装了基于C的bsdiff库的描述: bsdiff库是一个开源的二进制差分工具,它通过比较两个二进制文件的不同之处,生成一个含了这些差异的差分文件,然后可以将这个差分文件应用到原始文件上,从而得到新的目标文件。这个库的主要目的是提供一个高效的方式,用于对大型文件进行升级、更新和分发。 该bsdiff库的封装使用C语言编写,旨在为开发人员提供一个方便的接口,使他们能够轻松地使用bsdiff功能。封装库提供了一系列的函数,这些函数可以被调用来生成二进制差分文件以及应用差分文件。 使用该封装库,开发人员可以首先使用bsdiff函数来生成差分文件。这个函数需要输入原始文件、目标文件和生成的差分文件的路径。然后,开发人员可以使用apply_diff函数来应用差分文件,生成目标文件。这个函数需要输入原始文件、差分文件和生成的目标文件的路径。 封装库的设计考虑了性能和可靠性。通过仔细优化代码,并充分利用底层bsdiff库的特性,封装库能够以高效的方式生成和应用差分文件。此外,封装库还提供了错误处理机制,确保在生成和应用差分文件过程中出现错误时,能够进行适当的处理。 总体而言,这个基于C的bsdiff库的封装提供了一个简单易用、高效可靠的二进制差分工具,使开发人员能够轻松地生成和应用差分文件,从而实现文件的升级、更新和分发。 ### 回答3: bsdiff是一种用于生成和应用二进制补丁的开源库,它可以帮助实现两个版本之间的增量更新。要封装一个基于C的bsdiff库,可以按照以下步骤进行: 1. 首先,准备基于C的开发环境,如安装合适的编译器和编程工具。可以选择GCC或Clang等常用的C语言编译器。 2. 下载bsdiff的源代码。bsdiff的官方网站上(http://www.daemonology.net/bsdiff/)提供了最新版本的源代码。 3. 解压下载的源代码,并进入解压后的目录。 4. 检查源代码中的README或INSTALL文件,查找是否有构建和安装相关的说明。 5. 根据README或INSTALL文件中的说明,进行配置和构建。可能需要运行类似"./configure"的命令,然后运行"make"来编译源代码。 6. 构建成功后,将生成的库文件(通常是一个以.so或.a文件扩展名结尾的文件)添加到您的项目中。 7. 在项目中bsdiff库的头文件,以便可以使用相关的函数和数据结构。 8. 根据bsdiff库的API文档和示例代码,对其进行调用。bsdiff含了生成和应用二进制补丁的函数,可以根据需求选择适当的函数进行调用。 9. 通过编译和测试,验证封装的bsdiff库是否正确工作。确保增量更新功能能够正确生成和应用二进制补丁。 10. 封装的bsdiff库可以用于将两个版本的文件进行增量更新,以减少更新的数据量。这对于大型文件或网络传输来说非常有用。 封装一个基于C的bsdiff库需要通过下载源代码、配置、构建、添加库文件和头文件等步骤完成。通过调用bsdiff库的API函数,可以实现对文件的增量更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值