在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文件