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的编译与使用的更多相关文章

  1. 编译和使用bsdiff

    在android开发中,越到后面生成apk文件越来越大,每次用户更新都是全部下载更新,浪费时间和流量,如果能增量更新就不错了,使用bsdiff就是为了生成更新包 bsdiff下载地址:http://w ...

  2. android源码编译1

    一.环境说明: 1.liunx系统:Ubuntu12.04 2.jdk:sun-java6-jdk 3.g++4.5 gcc4.5 二.android源码的目录结构 |-- Makefile |-- ...

  3. 下载编译Chrome详细步骤

    文章来源:http://blog.csdn.net/allendale/article/details/9262833 参考:http://dev.chromium.org/developers/ho ...

  4. 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)

                 分类: Android 系统开发(5)                                              作者同类文章X 版权声明:本文为博主原创文章 ...

  5. bsdiff差分算法

    bsdiff的基本原理 bsdiff是由Conlin Percival开源的一个优秀的差分算法,而且是跨平台的.在Android系统中所使用的imgdiff本质上就是bsdiff. bsdiff的依据 ...

  6. Android OTA在线升级二(升级包编译原理分析) 【转】

    本文转载自:http://blog.csdn.net/huryjiang/article/details/7590015 1 升级包的制作 基本命令: Ø  makeMtk [project[flav ...

  7. I.MX6 Android 5.1.1 下载、编译

    /************************************************************************* * I.MX6 Android 5.1.1 下载. ...

  8. 编译Chrome详细步骤

    编译Chrome详细步骤   文章来源:http://blog.csdn.net/allendale/article/details/9262833 参考:http://dev.chromium.or ...

  9. 编译Android 4.4.4 r1的源码刷Nexus 5手机详细教程

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/54562606 网上关于编译Android源码的教程已经很多了,但是讲怎么编译And ...

随机推荐

  1. 细说REST API安全之概述

    目前许多前后端应用都采取REST架构风格,前端应用和后端服务通过API进行数据交换.通过REST API在网络中进行数据交换时很容易被网络抓包,然后进行恶意批量调用,最终导致后端服务不堪负重而影响正常 ...

  2. Word设置多级标题

    选中标题1的内容,点击编号图标,选中一个经典的编号模板,如下图 之后,再次点击编号图标,然后选中“定义新的多级列表”,将打开一个对话框 确保标题1的标号正确: 接着,确保标题2的编号正确: 依次类推, ...

  3. 网易PM599产品笔试题

    前几天做了网易PM599的云计算领域产培生的笔试题目,下面整理了一下各个方向的笔试题和我对这些题目的解答. 云计算领域: 1.对工业互联网的理解,结合自身优势谈谈自己应该怎么去创业. 工业互联网是一次 ...

  4. lombok注解介绍

    lombok注解介绍 lombok注解文档lombok官网下载 lombok是一个可以帮助我们简化java代码编写的工具类,尤其是简化javabean的编写,即通过采用注解的方式,消除代码中的构造方法 ...

  5. 12个实用的 JavaScript 框架分享给前端开发者

    JavaScript库是预先编写的 JavaScript 工具代码,让开发者可以更容易开发 JavaScript 应用.这个列表我们列出了2017年1月份功能丰富的 JavaScript 库,可以帮助 ...

  6. Coursera Deep Learning 2 Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization - week1, Assignment(Gradient Checking)

    声明:所有内容来自coursera,作为个人学习笔记记录在这里. Gradient Checking Welcome to the final assignment for this week! In ...

  7. 【mmall】学习Spring要善用Spring的Github

    官网:https://projects.spring.io/spring-framework 宠物医院项目(非常经典的Spring项目):https://github.com/spring-proje ...

  8. icon图标制作网站推荐

    推荐链接 easyicon

  9. Trades FZU - 2281 (贪心)(JAVA)

    题目链接: J - Trades  FZU - 2281 题目大意: 开始有m个金币, 在接下来n天里, ACMeow可以花费ci金币去买一个物品, 也可以以ci的价格卖掉这个物品, 如果它有足够的金 ...

  10. docker remote api 的安全隐患

    开启docker的api,首先要知道docker的守护进程daemon,在下认为daemon作为Client和service连接的一个桥梁,负责代替将client的请求传递给service端. 默认情 ...