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 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

即.ifndef WITHOUT_MAN,.endi语句f前面加TAB键进行缩进

然后再执行make,此时又报错:

bspatch.c:39:21: error: unknown type name ‘u_char‘; did you mean ‘char‘?
static off_t offtin(u_char *buf)
                    ^~~~~~
                    char
bspatch.c:65:8: error: expected ‘;‘ after expression
        u_char header[32],buf[8];
              ^
              ;
bspatch.c:65:2: error: use of undeclared identifier ‘u_char‘; did you mean ‘putchar‘?
        u_char header[32],buf[8];
        ^~~~~~
        putchar
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/stdio.h:261:6: note:
      ‘putchar‘ declared here
int      putchar(int);
         ^
bspatch.c:65:9: error: use of undeclared identifier ‘header‘
        u_char header[32],buf[8];
               ^
bspatch.c:65:20: error: use of undeclared identifier ‘buf‘
        u_char header[32],buf[8];
                          ^
bspatch.c:66:2: 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.12.sdk/usr/include/stdio.h:261:6: note:
      ‘putchar‘ declared here
int      putchar(int);
         ^
bspatch.c:66:10: error: use of undeclared identifier ‘old‘
        u_char *old, *new;
                ^
bspatch.c:66:16: error: use of undeclared identifier ‘new‘
        u_char *old, *new;
                      ^
bspatch.c:93:12: error: use of undeclared identifier ‘header‘
        if (fread(header, 1, 32, f) < 32) {
                  ^
bspatch.c:100:13: error: use of undeclared identifier ‘header‘
        if (memcmp(header, "BSDIFF40", 8) != 0)
                   ^
bspatch.c:104:19: error: use of undeclared identifier ‘header‘
        bzctrllen=offtin(header+8);
                         ^
bspatch.c:105:19: error: use of undeclared identifier ‘header‘
        bzdatalen=offtin(header+16);
                         ^
bspatch.c:106:17: error: use of undeclared identifier ‘header‘
        newsize=offtin(header+24);
                       ^
bspatch.c:137:5: error: use of undeclared identifier ‘old‘
                ((old=malloc(oldsize+1))==NULL) ||
                  ^
bspatch.c:139:12: error: use of undeclared identifier ‘old‘
                (read(fd,old,oldsize)!=oldsize) ||
                         ^
bspatch.c:141:6: error: use of undeclared identifier ‘new‘
        if((new=malloc(newsize+1))==NULL) err(1,NULL);
            ^
bspatch.c:147:43: error: use of undeclared identifier ‘buf‘
                        lenread = BZ2_bzRead(&cbz2err, cpfbz2, buf, 8);
                                                               ^
bspatch.c:151:19: error: use of undeclared identifier ‘buf‘
                        ctrl[i]=offtin(buf);
                                       ^
bspatch.c:159:42: error: use of undeclared identifier ‘new‘
                lenread = BZ2_bzRead(&dbz2err, dpfbz2, new + newpos, ctrl[0]);
                                                       ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
make: *** [bspatch] Error 1

在bspatch.c文件中加入#include <sys/types.h>

然后再执行make命令,此时命令执行成功,会在当前目录下生成bsdiff,bspatch文件

使用

生成差异文件,常用于服务端生成差异包

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值是一致的

时间: 2024-12-28 21:30:45

bsdiff的编译与使用的相关文章

android源码编译1

一.环境说明: 1.liunx系统:Ubuntu12.04 2.jdk:sun-java6-jdk 3.g++4.5 gcc4.5 二.android源码的目录结构 |-- Makefile |-- bionic (bionic C库) |-- bootable (启动引导相关代码) |-- build (存放系统编译规则及generic等基础开发包配置) |-- cts (Android兼容性测试套件标准) |-- dalvik (dalvik JAVA虚拟机) |-- development

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

作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/51592930 手机的两种模式 : 在下面有详细的图片示例; -- Recovery 模式 : 音量键增加 + 电源键, 长按上述组合键, 看到 "MI" 的 LOGO 后即进入 Recovery 模式; -- Fastboot 模式 : 音量键减小 + 电源键, 长按上述组合键, 看到 "FASTBOOT" 后, 即 进入 FA

I.MX6 Android 5.1.1 下载、编译

/************************************************************************* * I.MX6 Android 5.1.1 下载.编译 * 说明: * 这里要提到的就是4.2版本,编译中断了,你接着编好像是没事的,但是这个 * 5.1.1版本貌似就得从头再编,这个有点郁闷. * * 2016-9-9 深圳 南山平山村 曾剑锋 ***************************************************

完整版linux下android源码下载、编译、模拟器启动运行

一.环境说明: 1.VMware版本:8.0.3 build-703057 2.liunx系统:Ubuntu10.10 3.jdk:sun-java6-jdk 二.Ubuntu 10.10更新源列表 由于??Ubuntu 10.10版本的源已经过期了,所以,需要对其进行更新,Ubuntu 10.10 已经发布了,下面提供更新源方法与更新源列表地址: 1.sudo gedit /etc/apt/sources.list     编辑你的源列表,将原来的内容全部删除,添加下面的源,复制到你的列表中,

编译Chrome详细步骤

文章来源:http://blog.csdn.net/allendale/article/details/9262833 参考:http://dev.chromium.org/developers/how-tos/build-instructions-windows 1      Chrome的代码量巨大,下载编译的过程一出错,可能就需要回头从来.工欲善其事,必先利其器,推荐电脑内存至少8G,否则会难以忍受的慢,当然是64位系统,您还需要设置显示文件后缀名.如图,将勾选去掉 2   然后安装Vis

游戏差异更新—PC蛋蛋源码下载BSDiff算法解析

PC蛋蛋源码下载联系方式:QQ:2747044651 网址请添加链接描述----pi2502差异更新即在软件更新时只更新差异化的部分,以达到用最小的下载量完成软件的更新需求.该思想由来已久,从刚接触电脑时的操作系统.应用软件快速更新功能或填补漏洞,到迭代更加频繁的移动应用时代更多了节省下载流量费用的需求.尤其在移动游戏领域,随着手机性能的提升和玩家对游戏体验的追求,安装包亦是越来越大,并且会频繁的更新以不断给玩家带来更新的玩法和更为优化的体验.然而,这种频繁的更新也同样会带来负面的影响:更新包太

C++工程编译之“error LNK2001: 无法解析的外部符号”

今天一整天都在折腾“error LNK2001: 无法解析的外部符号”,就在头疼不已的时候,总算是找到问题原因了:各个动态链接库的编译方式必须统一才行,要不然很容易对库函数的引用产生冲突.简单来说就是,如果使用的第三方函数库编译方式采用/MD,那么主工程也应该使用/MD.我使用了libevent,而主工程默认采用/MT,所以需要忽略一大堆的函数库,我还纳闷呢,怎么会这么奇怪!!今天总算是解决了长久以来的困惑了. 下面引用一篇文章的描述:[Z]VC运行库版本不同导致链接.LIB静态库时发生重复定义

基于源码编译openssl

openssh依赖于openssl,由于ssl频繁曝出漏洞,牵扯到openssh.而自身也存在漏洞... 00.下载openssl https://www.openssl.org/source/ https://github.com/openssl/openssl/releases https://www.openssl.org/source/openssl-1.0.2l.tar.gz 01.准备工作 yum -y install perl perl-devel gcc gcc-c++ 02.编

maven依赖本地非repository中的jar包-依赖jar包放在WEB-INF/lib等目录下的情况客户端编译出错的处理

maven依赖本地非repository中的jar包 http://www.cnblogs.com/piaolingxue/archive/2011/10/12/2208871.html 博客分类: MAVEN 今天在使用maven编译打包一个web应用的时候,碰到一个问题: 项目在开发是引入了依赖jar包,放在了WEB-INF/lib目录下,并通过buildpath中将web libariary导入. 在eclipse中开发没有问题,但是使用maven编译插件开始便宜总是报找不到WEB-INF