跟着红橙的视频学习热更新 需要使用到bspatch和bsdiff技术 本来打算在windows上搞的,无奈windows上各种编译错误 也没有提示。一怒之下下了个VMware 装了个虚拟机,结果从下载bsdiff到搞出效果不超过一个小时就搞完了。无怪乎那么多人喷Windows上开发那么不方便了,我在windows上可是尝试了十几个小时呢。。。。吐槽结束下面进入正题。

bspatch和bspatch简介

bspatch和bsdiff是一个基于C编写的第三方库文件,bsdiff可以对比A B两个文件的差异并生成一个patch,bspatch则可以将该patch与AB的其中一个文件合并 并形成新的A或者B,这个技术可以运用在热更新中 这样老用户只要下载一个patch包就可以得到新的apk 达到节省流量的目的

参考链接:
https://www.jianshu.com/p/33f75ace683c
https://blog.csdn.net/lmj623565791/article/details/52761658
第一步 下载bsdiff4.3 版本
官网链接:
http://www.daemonology.net/bsdiff/
但是我遇到问题You don’t have permission to access this resource.
我们可以从hongyang大神的博客中下载到他下载好的包
或者从这里下载:
https://src.fedoraproject.org/lookaside/pkgs/bsdiff/bsdiff-4.3.tar.gz/e6d812394f0e0ecc8d5df255aa1db22a/
或者从github下载
https://github.com/mendsley/bsdiff
不过从github下载的make文件是automake的格式的 我不是很了解如何编译
这里以
https://src.fedoraproject.org/lookaside/pkgs/bsdiff/bsdiff-4.3.tar.gz/e6d812394f0e0ecc8d5df255aa1db22a/
下载的资源为例
解压后如下
在这里插入图片描述
接着一步步解决编译错误

1.格式问题

hjcai@ubuntu:~/Desktop/bsdiff-4.3$ make
Makefile:13: *** missing separator.  Stop.

在这里插入图片描述
上面的第13行和第15行前面需要插入tab符 这是make的语法规则

2.依赖问题

hjcai@ubuntu:~/Desktop/bsdiff-4.3$ make
cc -O3 -lbz2    bsdiff.c   -o bsdiff
bsdiff.c:33:10: fatal error: bzlib.h: No such file or directory
   33 | #include <bzlib.h>
      |          ^~~~~~~~~
compilation terminated.
make: *** [<builtin>: bsdiff] Error 1
提示找不到 bzlib.h:
这里需要安装libbz2

执行
root@ubuntu:/home/hjcai/Desktop/bsdiff-4.3# sudo apt-get install libbz2-dev

3.编译问题

root@ubuntu:/home/hjcai/Desktop/bsdiff-4.3# make
cc -O3 -lbz2    bsdiff.c   -o bsdiff
/usr/bin/ld: /tmp/ccy6h0dp.o: in function `main':
bsdiff.c:(.text.startup+0x2be): undefined reference to `BZ2_bzWriteOpen'
/usr/bin/ld: bsdiff.c:(.text.startup+0x8d1): undefined reference to `BZ2_bzWrite'
/usr/bin/ld: bsdiff.c:(.text.startup+0x964): undefined reference to `BZ2_bzWrite'
/usr/bin/ld: bsdiff.c:(.text.startup+0xa0e): undefined reference to `BZ2_bzWrite'
/usr/bin/ld: bsdiff.c:(.text.startup+0xbbf): undefined reference to `BZ2_bzWriteClose'
/usr/bin/ld: bsdiff.c:(.text.startup+0xc15): undefined reference to `BZ2_bzWriteOpen'
/usr/bin/ld: bsdiff.c:(.text.startup+0xc3d): undefined reference to `BZ2_bzWrite'
/usr/bin/ld: bsdiff.c:(.text.startup+0xc60): undefined reference to `BZ2_bzWriteClose'
/usr/bin/ld: bsdiff.c:(.text.startup+0xcb3): undefined reference to `BZ2_bzWriteOpen'
/usr/bin/ld: bsdiff.c:(.text.startup+0xcdb): undefined reference to `BZ2_bzWrite'
/usr/bin/ld: bsdiff.c:(.text.startup+0xcfe): undefined reference to `BZ2_bzWriteClose'
collect2: error: ld returned 1 exit status
make: *** [<builtin>: bsdiff] Error 1

这里可能是编译器问题 修改Make文件

CFLAGS		+=	-O3 -lbz2

PREFIX		?=	/usr/local
INSTALL_PROGRAM	?=	${INSTALL} -c -s -m 555
INSTALL_MAN	?=	${INSTALL} -c -m 444

all:		bsdiff bspatch
bsdiff:		bsdiff.c
	cc bsdiff.c ${CFLAGS} -o bsdiff  #增加
bspatch:	bspatch.c
	cc bspatch.c ${CFLAGS} -o bspatch #增加

install:
	${INSTALL_PROGRAM} bsdiff bspatch ${PREFIX}/bin
	.ifndef WITHOUT_MAN
	${INSTALL_MAN} bsdiff.1 bspatch.1 ${PREFIX}/man/man1
	.endif

这里要感谢
https://www.jianshu.com/p/33f75ace683c
的作者
再次编译 应该会生成两个文件bsdiff以及bspatch
到这里我们基本已经很接近成功了!
准备两个版本的apk 我这里准备的两个apk 一个text写的version1.0 一个text写的version2.0
在这里插入图片描述
最后可以安装new.apk 看看是否内容与2.0.apk内容一致
这一节只是学习bspatch bsdiff的使用 下一节学习在Android中使用这个工具

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐