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

bsdiff下载地址:http://www.daemonology.net/bsdiff/

下载后解压文件,到文件目录中,执行make

你会发现不能通过,报错了

Makefile:13: *** missing separator.  Stop.

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

13行开始到最后前面加TAB,为什么要这样请自行查阅makefile的规则了

保存后再make

还是有问题,不过bsdiff正常生成了

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

错误很明显,找不到u_char等,因为缺少了头文件

在文件中加入

#include <sys/types.h>
一般这个文件会放到/usr/include/sys/types.h,可以自行查看源码,很简单

再次make就好了

bsdiff使用很简单

bsdiff oldfile newfile patchfile

oldfile:旧的文件

newfile:生成的新文件

patchfile:生成的patch文件

  

编译和使用bsdiff的更多相关文章

  1. android黑科技系列——应用市场省流量更新(增量升级)原理解析

    一.前言 最近在看热修复相关的框架,之前我们已经看过了阿里的Dexposed和AndFix这两个框架了,不了解的同学可以点击这里进行查看:Dexposed框架原理解析 和 AndFix热修复框架原理解 ...

  2. bsdiff的编译与使用

    bsdiff是一个差异包比较工具,可以用来实现增量更新. 下载地址:http://www.daemonology.net/bsdiff 编译 Mac环境 版本:macOS 10.12 1.解压下载的b ...

  3. android源码编译1

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

  4. 下载编译Chrome详细步骤

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

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

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

  6. bsdiff差分算法

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

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

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

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

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

  9. 编译Chrome详细步骤

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

随机推荐

  1. 转 php simple test

    转自 后期移至 以下为汪大哥写的 yunlian服务监控 如何写监控代码 首先在tests目录下新建一个文件xxx.php.其中xxx为你的服务名. class XxxTestCase extends ...

  2. react-native 适配问题

    const ScreenWidth = Dimensions.get('window').width; static DimensionsTransform(px) { // 设计图纸以750为基准 ...

  3. jquery鼠标点击窗口或浮动层以外关闭层【阻止冒泡事件】

    $(".up-list a.th1").click(function(){ $(this).next("ul#up-list-ul").show(); }); ...

  4. (1)angularJs

    一. 1.下载 https://angularjs.org/ 2.网络引用 https://code.angularjs.org/ 3.模块内引用 angularjs <body ng-app& ...

  5. Spring Cloud系列文,Feign整合Ribbon和Hysrix

    在本博客之前的Spring Cloud系列里,我们讲述了Feign的基本用法,这里我们将讲述下Feign整合Ribbon实现负载均衡以及整合Hystrix实现断路保护效果的方式. 1 准备Eureka ...

  6. python安装numpy和matplotlib

    1.从该链接下载对应的whl文件 2.按照下面的方式从whl文件安装即可 windows7 python2.7 1.用管理员方式打开cmd 2.首先通过pip命令安装wheel 如果提示’pip’不是 ...

  7. HTTP状态码之200和304

    HTTP状态码之200和304   HTTP状态码(HTTP Status Code)是一种表示网页服务器响应状态的三位数字编码.通过这些数字,可以简化状态的表达.状态码有几十种,其中首位数字为1-5 ...

  8. layui-时间选择器-时间范围选择

    HTML: JS: layui.use(['laydate'],function{ }); start:就为你选择的开始日期; end:就为你选择的结束日期 此方式可选择任意范围的时间,时间格式可任意 ...

  9. php 打印今天,昨天,本周,上周,当月,上月,本季,上季,今年,去年数据

    if($filter['mode']) { switch ($filter['mode']) { case 1://今天的数据 $time_start = date("Y-m-d H:i:s ...

  10. eclipse中通过search打开第二个文件时 第一个文件就自己关闭了

    原文:http://blog.csdn.net/u014079773/article/details/66971053 问题:eclipse中通过search打开第二个文件时第一个文件就自己关闭了 问 ...