bsdiff介紹:
bsdiff是一種二級制差分工具,由bsdiff與bspatch組成斜脂, 將oldfile與newfile做二進制數(shù)據(jù)差分(bsdiff操作),得到更新的部分(patch文件)触机,再與oldfile進行合成(bspatch操作)帚戳。比如icon增量更新為例,old圖片資源有5個icon儡首,new圖片資源在之前的5個icon上加了10個新的icon销斟,這是old與new進行bsdiff操作,會生成增量10個icon的patch文件椒舵,接下來再與old圖片資源進行bspatch操作蚂踊,最后合成了最新的15個icon圖片資源。
下載bsdiff bzip
- bsdiff下載鏈接為:http://www.daemonology.net/bsdiff/
- bzip下載鏈接:http://www.bzip.org/downloads.html
開始正題
-
新建一個工程笔宿,將下載好的bsdiff bzip導(dǎo)入工程中犁钟,導(dǎo)入文件內(nèi)容:
-
編譯工程文件棱诱,會報一個函數(shù)重載的error
需要在panic方法前添加__attribute__((overloadable))
-
繼續(xù)編譯項目
回報如下的錯誤,原因是存在相同的main函數(shù)涝动,我們按照錯誤提示迈勋,到每個方法中進行文件重命名即可。
此時編譯醋粟,成功C夜健!米愿!
- 因為bsdiff為C語言編寫厦凤,oc引用C需要新建一個pch文件,在pch引用bsdiff.c與bspatch.c的方法(該方法名是我將main方法改成此方法名)
int BsdiffUntils_bsdiff(int argc, char *argv[]);
int BsdiffUntils_bspatch(int argc,char * argv[]);
- 并在bsdiff.c與bspatch.c中include該pch文件育苟。
- 因在本地進行測試较鼓,所有正常要在服務(wù)器做的bsdiff操作也需要在本地進行操作
- 我這里找了6張圖片,其中3張壓縮成zip违柏,作為old文件博烂, 所有的6張壓縮成zip,作為new文件漱竖。
- 調(diào)用bsdiff方法
#pragma Mark - Bsdiff
- (void)Bsdiff
{
const char *argv[4];
argv[0] = "bsdiff";
// oldPath
NSString *path1 = [NSString stringWithFormat:@"/%@/%@",[NSBundle mainBundle].bundlePath, @"old.zip"];
argv[1] = [path1 UTF8String];
// newPath
NSString *path2 = [NSString stringWithFormat:@"/%@/%@",[NSBundle mainBundle].bundlePath, @"new.zip"];
// argv[2] = argv[1] = [[NSString stringWithFormat:@"file://%@", path2] UTF8String];
argv[2] = [path2 UTF8String];
// patchPath
argv[3] = [[self createFileWithFileName:@"bsdiff_Test"] UTF8String];
int result = BsdiffUntils_bsdiff(4, argv);
}
參數(shù)1:為固定字符串
參數(shù)2:oldfile的文件路徑
參數(shù)3:newfile的文件路徑
參數(shù)4:合成patch的文件路徑
此時禽篱,運行項目,會在對應(yīng)路徑下出現(xiàn)一個bsdiff_Test的文件馍惹,這個文件就是oldfile與newfile差分出來的文件躺率,也就是需要更新的文件,但是這個文件不是直接就可以使用的讼积,需要我們用bspatch方法將其合成zip文件
- 調(diào)用bspatch方法
#pragma Mark - Bspatch
- (void)Bspatch
{
const char *argv[4];
argv[0] = "bspatch";
// oldPath
NSString *path1 = [NSString stringWithFormat:@"/%@/%@",[NSBundle mainBundle].bundlePath, @"old.zip"];
argv[1] = [path1 UTF8String];
// newPath
argv[2] = [[self createFileWithFileName:@"Test_Result.zip"] UTF8String];
// patchPath
argv[3] = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"bsdiff_Test"] UTF8String];
int result = BsdiffUntils_bspatch(4, argv);
}
參數(shù)1:為固定字符串
參數(shù)2:oldfile的文件路徑
參數(shù)3:oldfile與patch合成成zip文件的目標(biāo)路徑
參數(shù)4:上一步差分出來的patch文件路徑
- 運行項目,在對應(yīng)路徑下脚仔,就會看到Test_Result.zip文件勤众,此時解壓此壓縮包,就為完整的文件鲤脏。
另外的測試:比如oldfile有5個圖片们颜,newfile有10個圖片,其中old中有三個圖片被刪除了猎醇,這時oldfile與newfile進行bsdiff時窥突,patch出來的就是7個文件,這些都可以自行測試硫嘶,這里就不在此贅述了