bsdiff的编译与使用
bsdiff是一个差异包比较工具,可以用来实现增量更新.
下载地址:http://www.daemonology.net/bsdiff
编译
Mac环境
版本:macOS 10.12
1.解压下载的bsdiff-4.3.tar.gz
tar -zxvf bsdiff-4.3.tar.gz
2.进入bsdiff-4.3目录,在终端下执行构建
cd bsdiff-4.3
make
此时报错: Makefile:13: *** missing separator. Stop.
这是makefile文件的内容的格式不对,修改Makefile文件,修改后的文件内容如下:
CFLAGS += -O3 -lbz2 PREFIX ?= /usr/local
INSTALL_PROGRAM ?= ${INSTALL} -c -s -m
INSTALL_MAN ?= ${INSTALL} -c -m all: bsdiff bspatch
bsdiff: bsdiff.c
bspatch: bspatch.c install:
${INSTALL_PROGRAM} bsdiff bspatch ${PREFIX}/bin
.ifndef WITHOUT_MAN
${INSTALL_MAN} bsdiff. bspatch. ${PREFIX}/man/man1
.endif
即.ifndef WITHOUT_MAN,.endi语句f前面加TAB键进行缩进
然后再执行make,此时又报错:
bspatch.c::: error: unknown type name 'u_char'; did you mean 'char'?
static off_t offtin(u_char *buf)
^~~~~~
char
bspatch.c::: error: expected ';' after expression
u_char header[],buf[];
^
;
bspatch.c::: error: use of undeclared identifier 'u_char'; did you mean 'putchar'?
u_char header[],buf[];
^~~~~~
putchar
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10..sdk/usr/include/stdio.h::: note:
'putchar' declared here
int putchar(int);
^
bspatch.c::: error: use of undeclared identifier 'header'
u_char header[],buf[];
^
bspatch.c::: error: use of undeclared identifier 'buf'
u_char header[],buf[];
^
bspatch.c::: error: use of undeclared identifier 'u_char'; did you mean 'putchar'?
u_char *old, *new;
^~~~~~
putchar
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10..sdk/usr/include/stdio.h::: note:
'putchar' declared here
int putchar(int);
^
bspatch.c::: error: use of undeclared identifier 'old'
u_char *old, *new;
^
bspatch.c::: error: use of undeclared identifier 'new'
u_char *old, *new;
^
bspatch.c::: error: use of undeclared identifier 'header'
if (fread(header, , , f) < ) {
^
bspatch.c::: error: use of undeclared identifier 'header'
if (memcmp(header, "BSDIFF40", ) != )
^
bspatch.c::: error: use of undeclared identifier 'header'
bzctrllen=offtin(header+);
^
bspatch.c::: error: use of undeclared identifier 'header'
bzdatalen=offtin(header+);
^
bspatch.c::: error: use of undeclared identifier 'header'
newsize=offtin(header+);
^
bspatch.c::: error: use of undeclared identifier 'old'
((old=malloc(oldsize+))==NULL) ||
^
bspatch.c::: error: use of undeclared identifier 'old'
(read(fd,old,oldsize)!=oldsize) ||
^
bspatch.c::: error: use of undeclared identifier 'new'
if((new=malloc(newsize+))==NULL) err(,NULL);
^
bspatch.c::: error: use of undeclared identifier 'buf'
lenread = BZ2_bzRead(&cbz2err, cpfbz2, buf, );
^
bspatch.c::: error: use of undeclared identifier 'buf'
ctrl[i]=offtin(buf);
^
bspatch.c::: error: use of undeclared identifier 'new'
lenread = BZ2_bzRead(&dbz2err, dpfbz2, new + newpos, ctrl[]);
^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
errors generated.
make: *** [bspatch] Error
在bspatch.c文件中加入#include <sys/types.h>
然后再执行make命令,此时命令执行成功,会在当前目录下生成bsdiff,bspatch文件
Ubuntu
版本:15.04
在终端执行sudo apt-get install bsdiff,执行完成后可以在/usr/bin目录下找到bsdiff,bspatch文件
OpenSUSE
版本:SUSE 11 SP4
1.解压下载的bsdiff-4.3.tar.gz
tar -zxvf bsdiff-4.3.tar.gz
2.进入bsdiff-4.3目录,在终端下执行构建
cd bsdiff-4.3
make
此时报错: Makefile:13: *** missing separator. Stop.
这是makefile文件的内容的格式不对,修改Makefile文件,修改后的文件内容如下:
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
bspatch: bspatch.c install:
${INSTALL_PROGRAM} bsdiff bspatch ${PREFIX}/bin
.ifndef WITHOUT_MAN
${INSTALL_MAN} bsdiff.1 bspatch.1 ${PREFIX}/man/man1
.endif
接着编译,结果报错,找不到 bzlib.h头文件,这是由于bsdiff,bspatch依赖bzip2,下载bzip2,地址:http://www.bzip.org/downloads.html,然后执行以下命令
tar zxvf bzip2-1.0.6.tar.gz
cd bzip2-1.0.6
make
sudo make install
然后再编译bsdiff,出现以下信息:

修改Makefile, 修改后如下:
CC=gcc
LDFLAGS=
CFLAGS += -O3 -lbz2 PREFIX ?= /usr/local
INSTALL_PROGRAM ?= cp
INSTALL_MAN ?= cp all: bsdiff bspatch
bsdiff: bsdiff.c
$(CC) bsdiff.c $(CFLAGS) $(LDFLAGS) -o bsdiff
bspatch: bspatch.c
$(CC) bspatch.c $(CFLAGS) $(LDFLAGS) -o bspatch
install:
${INSTALL_PROGRAM} bsdiff bspatch ${PREFIX}/bin
${INSTALL_MAN} bsdiff. bspatch. ${PREFIX}/man/man1
然后再编译,安装就可以了

使用
生成差异文件,常用于服务端生成差异包
bsdiff oldfile newfile patchfile
oldfile: 旧的文件
newfile:新的文件
patchfile:生成的差异文件
合并文件,常用于客户端根据差异包合并生成新的文件
bspatch oldfile newfile2 patchfile
oldfile:旧的文件
newfile2:生成的新的文件
patchfile:差异文件
举个例子,测试一下使用bsdiff进行增量更新
./bsdiff old.apk new.apk old-new.patch
./bspatch old.apk new2.apk old-new.patch
md5 new.apk
MD5 (new.apk) = fc8bdb15f80abef22eb25f9601063cf0
md5 new2.apk
MD5 (new2.apk) = fc8bdb15f80abef22eb25f9601063cf0
此时new.apk和new2.apk的md5值是一致的

bsdiff的编译与使用的更多相关文章
- 编译和使用bsdiff
在android开发中,越到后面生成apk文件越来越大,每次用户更新都是全部下载更新,浪费时间和流量,如果能增量更新就不错了,使用bsdiff就是为了生成更新包 bsdiff下载地址:http://w ...
- android源码编译1
一.环境说明: 1.liunx系统:Ubuntu12.04 2.jdk:sun-java6-jdk 3.g++4.5 gcc4.5 二.android源码的目录结构 |-- Makefile |-- ...
- 下载编译Chrome详细步骤
文章来源:http://blog.csdn.net/allendale/article/details/9262833 参考:http://dev.chromium.org/developers/ho ...
- 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)
分类: Android 系统开发(5) 作者同类文章X 版权声明:本文为博主原创文章 ...
- bsdiff差分算法
bsdiff的基本原理 bsdiff是由Conlin Percival开源的一个优秀的差分算法,而且是跨平台的.在Android系统中所使用的imgdiff本质上就是bsdiff. bsdiff的依据 ...
- Android OTA在线升级二(升级包编译原理分析) 【转】
本文转载自:http://blog.csdn.net/huryjiang/article/details/7590015 1 升级包的制作 基本命令: Ø makeMtk [project[flav ...
- I.MX6 Android 5.1.1 下载、编译
/************************************************************************* * I.MX6 Android 5.1.1 下载. ...
- 编译Chrome详细步骤
编译Chrome详细步骤 文章来源:http://blog.csdn.net/allendale/article/details/9262833 参考:http://dev.chromium.or ...
- 编译Android 4.4.4 r1的源码刷Nexus 5手机详细教程
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/54562606 网上关于编译Android源码的教程已经很多了,但是讲怎么编译And ...
随机推荐
- 按科室统计 2.181222版本 关联查询join 不对
SQL: select t0.deptName, t0.deptId, t0.startTime, t0.endTime, IFNULL(t0.num,) as num0, IFNULL(t1.num ...
- lua 立即执行函数
背景 不同文件中,lua提供模块写法, 使用local修饰,可以将变量或者函数,声明为模块内有效,例如 模块暴漏变量使用 return 表的方式. local aafunc = function() ...
- Array.apply(null,{length:6}).map()
map定义和方法 map()方法返回一个新数组,数组中的元素为原始数组元素调用函数处理的后值. map()方法按照原始数组元素顺序依次处理元素. 注意: map不会对空数组进行检测 map不会改变原始 ...
- 自动化测试平台的搭建--Jenkins
1.下载:进入官网https://jenkins.io/download/,直接下载war包(约70M): 2.将下载好的war包直接放入到tomcat/webapp下: 3.进入bin目录下启动服务 ...
- day 8 - 1 文件操作
文件操作 注意: 1. r+ 最为常用 2.encoding 的编码格式一定要与文件编码格式一致 读取 r rb #在本地创建 txt 格式的文件默认使用 gbk 格式 f = open('e:/p ...
- Python 关于在ubuntu部署Django项目
Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求.ng ...
- 微服务之Spring cloud
微服务 Spring cloud Spring Cloud provides tools for developers to quickly build some of the common patt ...
- Git坑点——remote: error: GH007: Your push would publish a private email address.
使用命令:git push -u origin master ,把本地库的内容推送到远程库的过程中,出现了问题 ——remote: error: GH007: Your push would pu ...
- javascript/ajax和php 进阶 之 项目实战
1,使用异步思想做一个下拉列表,能够选择和展示数据库中对应的信息. 1,事件知识:所有的事件可参照:https://www.jb51.net/html5/459444.html 2,js中this补充 ...
- Nginx系列2:用Nginx搭建一个可用的静态资源Web服务器
上一节中编译好自己的nginx服务器后, 现在要对nginx.conf文件进行配置,搭建一个可用的静态资源Web服务器 1.放入可访问的html文件到nginx文件夹下,如图1所示: 这里我放入的是一 ...