iOS 使用bsdiff進行資源文件增量更新(bsdiff / bspatch)

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原理.png

下載bsdiff bzip

開始正題

  • 新建一個工程笔宿,將下載好的bsdiff bzip導(dǎo)入工程中犁钟,導(dǎo)入文件內(nèi)容:


    image.png
  • 編譯工程文件棱诱,會報一個函數(shù)重載的error


    image.png
需要在panic方法前添加__attribute__((overloadable))
  • 繼續(xù)編譯項目
    回報如下的錯誤,原因是存在相同的main函數(shù)涝动,我們按照錯誤提示迈勋,到每個方法中進行文件重命名即可。

    image.png

  • 此時編譯醋粟,成功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個文件,這些都可以自行測試硫嘶,這里就不在此贅述了

demo傳送門:https://github.com/bestmmmz/Bsdiff_demo/tree/master

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阻问,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子沦疾,更是在濱河造成了極大的恐慌称近,老刑警劉巖第队,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異刨秆,居然都是意外死亡凳谦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門衡未,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尸执,“玉大人,你說我怎么就攤上這事缓醋∪缡В” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵改衩,是天一觀的道長岖常。 經(jīng)常有香客問我,道長葫督,這世上最難降的妖魔是什么竭鞍? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮橄镜,結(jié)果婚禮上偎快,老公的妹妹穿的比我還像新娘。我一直安慰自己洽胶,他們只是感情好晒夹,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著姊氓,像睡著了一般丐怯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上翔横,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天读跷,我揣著相機與錄音,去河邊找鬼禾唁。 笑死效览,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的荡短。 我是一名探鬼主播丐枉,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼掘托!你這毒婦竟也來了瘦锹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沼本,沒想到半個月后噩峦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡抽兆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年识补,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辫红。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡凭涂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贴妻,到底是詐尸還是另有隱情切油,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布名惩,位于F島的核電站澎胡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏娩鹉。R本人自食惡果不足惜攻谁,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弯予。 院中可真熱鬧戚宦,春花似錦、人聲如沸锈嫩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呼寸。三九已至艳汽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間对雪,已是汗流浹背河狐。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留慌植,地道東北人甚牲。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓义郑,卻偏偏與公主長得像蝶柿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子非驮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 增量更新在Android開發(fā)中是一種很常見的技術(shù)。 增量更新的原理 增量更新的原理非常簡單芙扎,就是將本地apk與服務(wù)...
    re冷星閱讀 1,561評論 3 3
  • 最近就是在練習(xí)ndk開發(fā)星岗,剛好遇到android增量更新的話題,主要是工具的運用戒洼,略帶使用第三方so庫的流程~~~...
    紅黑軍團號閱讀 547評論 1 3
  • Android 增量更新 最近的項目需求俏橘,最近對這個增量更新有了一些認(rèn)識,另外把增量更新的一下資料整理給大家分析一...
    老金的自在生活閱讀 10,528評論 0 23
  • 在前幾年圈浇,整體移動網(wǎng)絡(luò)環(huán)境相比現(xiàn)在差很多寥掐,加之流量費用又相對較高,因此每當(dāng)我們發(fā)布新版本的時候磷蜀,一些用戶升級并不是...
    涅槃1992閱讀 5,470評論 2 39
  • @[增量更新,差分包,bsdiff/patch] 背景 隨著Android app的不斷迭代升級召耘,功能越來越多,a...
    SunYo閱讀 14,422評論 2 7