Android通過NDK開發(fā)完成增量更新功能

1锯茄,增量更新

在目前的大部分熱門應(yīng)用中(QQ、微信、抖音等)都包含了一個名稱類似 libbspatch.so的動態(tài)庫熙暴,而且通過:

nm -D xx.so

查看這些庫中的符號內(nèi)容都差不多,因此它們肯定是實現(xiàn)了同一件事情慌盯,也就是 ”增量更新“

增量更新的原理周霉,就是將手機上已安裝apk與服務(wù)器端最新apk進行二進制對比,得到差分包(即兩個版本的差異文件)亚皂,用戶更新程序時俱箱,只需要下載差分包,并在本地使用差分包與已安裝apk灭必,合成新版apk狞谱。

2,好處

? 增量更新相較于全量更新的好處不言而喻禁漓,利用差分算法獲得1.0版本到2.0版本的差分包跟衅,這樣在安裝了1.0的設(shè)備上只要下載這個差分包就能夠完成由1.0-2.0的更新。比如:

存在一個1.0版本的apk

apk1.png

然后需要升級到2.0版本播歼,而2.0版本的apk為

apk2.png

這樣如果進行全量更新則需要下載完整的76.6M大小的apk文件伶跷,進行安裝。而如果使用增量更新則只需要下載如下 50.7M的差分包荚恶。

patch.png

下載數(shù)據(jù)減少了26M撩穿。這樣做的好處不僅僅在于對于流量的節(jié)省。對于用戶來說現(xiàn)在流量可能并不值錢谒撼,或者使用wifi再進行更新食寡,但是從下載時間能夠得到一個良好的優(yōu)化,同時也減小了服務(wù)器的壓力廓潜。

實現(xiàn)

需要實現(xiàn)增量更新抵皱,現(xiàn)在有各種開源的制作與合并差分包的開源庫,比如:bsdiff辩蛋、hdiff等等呻畸。因此我們只需要獲得源碼來使用即可。

bsdiff 下載地址:

http://www.daemonology.net/bsdiff/

bsdiff 依賴bzip2(zip壓縮庫)

https://nchc.dl.sourceforge.net/project/gnuwin32/bzip2/1.0.5/bzip2-1.0.5-src.zip

下載完成后解壓:

bsdiff源碼.png

bsdiff: 比較兩個文件的二進制數(shù)據(jù)悼院,生成差分包

bspatch: 合并舊的文件與差分包伤为,生成新文件

很顯然,bspatch我們需要在Android環(huán)境下來執(zhí)行,而bsdiff 一般會在你的存儲服務(wù)器當中執(zhí)行即電腦環(huán)境下執(zhí)行(win或linux)

bsdiff

對于windows绞愚,可以直接從 https://github.com/cnSchwarzer/bsdiff-win/releases 下載叙甸。

而Linux/Mac則可以自行編譯:

在Linux中的源碼解壓目錄直接執(zhí)行:make 會產(chǎn)生錯誤。需要修改:

install:
    ${INSTALL_PROGRAM} bsdiff bspatch ${PREFIX}/bin
.ifndef WITHOUT_MAN
    ${INSTALL_MAN} bsdiff.1 bspatch.1 ${PREFIX}/man/man1
.endif
#上面這段makefile片段顯然有問題(指令必須以tab開頭)
#因此需要修改為:
install:
    ${INSTALL_PROGRAM} bsdiff bspatch ${PREFIX}/bin
    .ifndef WITHOUT_MAN
    ${INSTALL_MAN} bsdiff.1 bspatch.1 ${PREFIX}/man/man1
    .endif
#也就是在 `.if` 和 `.endif` 前加一個 tab

修改后再來執(zhí)行make 如果出現(xiàn)找不到bzip2 no file found bzlib.h之類的錯誤位衩,則需要先安裝bzip2:

Ubuntu:

apt install libbz2-dev

Centos:

yum -y install bzip2-devel.x86_64

Mac:

brew install bzip2

如果執(zhí)行make出現(xiàn)

bsdiff.c:(.text.startup+0x2aa): undefined reference to `BZ2_bzWriteOpen'
bsdiff.c:(.text.startup+0xcfa): undefined reference to `BZ2_bzWrite'
bsdiff.c:(.text.startup+0xe37): undefined reference to `BZ2_bzWrite'
bsdiff.c:(.text.startup+0xf80): undefined reference to `BZ2_bzWrite'
bsdiff.c:(.text.startup+0xfe1): undefined reference to `BZ2_bzWriteClose'
bsdiff.c:(.text.startup+0x1034): undefined reference to `BZ2_bzWriteOpen'
bsdiff.c:(.text.startup+0x105c): undefined reference to `BZ2_bzWrite'
bsdiff.c:(.text.startup+0x1082): undefined reference to `BZ2_bzWriteClose'
bsdiff.c:(.text.startup+0x10d5): undefined reference to `BZ2_bzWriteOpen'
bsdiff.c:(.text.startup+0x1100): undefined reference to `BZ2_bzWrite'
bsdiff.c:(.text.startup+0x1126): undefined reference to `BZ2_bzWriteClose'

則修改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
        cc bsdiff.c ${CFLAGS} -o bsdiff  #增加
bspatch:        bspatch.c
        cc bspatch.c ${CFLAGS} -o bspatch #增加

install:
        ${INSTALL_PROGRAM} bsdiff bspatch ${PREFIX}/bin
        .ifndef WITHOUT_MAN
        ${INSTALL_MAN} bsdiff.1 bspatch.1 ${PREFIX}/man/man1
        .endif

而bspatch則需要在Android工程中使用NDK來進行編譯使用(見工程)

1裆蒸,新建一個支持ndk的AS項目

1544061840268.png
1544061926468.png

將上面解壓出來的源碼中的bspatch.c放到項目中,因為bspatch.c中導(dǎo)入了bzlib.h

1544062072052.png

所以需要新建一個bzip文件夾糖驴,將上面下載的bzip源碼copy進去

1544062173356.png

然后在CMakelist中進行配置

1544062269584.png

配置好之后就可以make一下不報錯就表示可以正常運行了

我們在android項目中創(chuàng)建一個native方法僚祷。這個native方法調(diào)用bspatch中的main方法來進行合并

1544062608155.png

因為這個main方法是調(diào)用的bspatch.c中的main方法所以需要加上

1544062651066.png

main方法的第二個參數(shù)要求的是一個char* [4],其中數(shù)組第一個數(shù)據(jù)可以隨意填,第二個數(shù)據(jù)是舊APK的路勁贮缕,第三個參數(shù)是差分包的路勁辙谜,第四個參數(shù)是輸出的新Apk的路勁,生成新APK成功之后就可以跳轉(zhuǎn)安裝了

參考demo

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末跷睦,一起剝皮案震驚了整個濱河市筷弦,隨后出現(xiàn)的幾起案子肋演,更是在濱河造成了極大的恐慌抑诸,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爹殊,死亡現(xiàn)場離奇詭異蜕乡,居然都是意外死亡,警方通過查閱死者的電腦和手機梗夸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進店門层玲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人反症,你說我怎么就攤上這事辛块。” “怎么了铅碍?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵润绵,是天一觀的道長。 經(jīng)常有香客問我胞谈,道長尘盼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任烦绳,我火速辦了婚禮卿捎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘径密。我一直安慰自己午阵,他們只是感情好,可當我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布享扔。 她就那樣靜靜地躺著底桂,像睡著了一般括细。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上戚啥,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天奋单,我揣著相機與錄音,去河邊找鬼猫十。 笑死览濒,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的拖云。 我是一名探鬼主播贷笛,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宙项!你這毒婦竟也來了乏苦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤尤筐,失蹤者是張志新(化名)和其女友劉穎汇荐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盆繁,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡掀淘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了油昂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片革娄。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖冕碟,靈堂內(nèi)的尸體忽然破棺而出拦惋,到底是詐尸還是另有隱情,我是刑警寧澤安寺,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布厕妖,位于F島的核電站,受9級特大地震影響我衬,放射性物質(zhì)發(fā)生泄漏叹放。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一挠羔、第九天 我趴在偏房一處隱蔽的房頂上張望井仰。 院中可真熱鬧,春花似錦破加、人聲如沸俱恶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽合是。三九已至了罪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間聪全,已是汗流浹背泊藕。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留难礼,地道東北人娃圆。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像蛾茉,于是被迫代替她去往敵國和親讼呢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,930評論 2 361

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

  • 1谦炬、普通更新和增量更新 首先了解一下應(yīng)用普通更新的邏輯(這里指不通過應(yīng)用市場更新):新版本發(fā)布后將APK文件上傳到...
    AxeChen閱讀 945評論 0 9
  • 增量更新在Android開發(fā)中是一種很常見的技術(shù)键思。 增量更新的原理 增量更新的原理非常簡單础爬,就是將本地apk與服務(wù)...
    re冷星閱讀 1,575評論 3 3
  • 0. 前言 如果只學(xué)理論,不做實踐稚机,不踩踩坑幕帆,一般很難發(fā)現(xiàn)真正實踐項目中的問題的获搏,也比較難以加深對技術(shù)的理解赖条。所以...
    LouisLau_6d51閱讀 1,998評論 0 7
  • 在移動網(wǎng)絡(luò)背景下,文案的作用不只是提供知識與信息常熙,更多的是建立與讀者的某種聯(lián)系與互動纬乍,我們輸出的內(nèi)容就是我們的品牌...
    無比簡單閱讀 330評論 0 0
  • 你還記得他嗎仿贬? 早就忘了。 我還沒說他是誰墓贿。 網(wǎng)上看到這個段子茧泪,便拿好友小芹做了試驗,果然她給了一樣的回答聋袋。 那一...
    拾荒Demo閱讀 325評論 0 0