Android平臺(tái)-實(shí)現(xiàn)應(yīng)用增量更新

1.概述

1.1.什么是應(yīng)用增量更新

當(dāng)我們要更新一個(gè)應(yīng)用的時(shí)候,以前很多更新的做法是下載一個(gè)新版本去覆蓋一個(gè)舊版本。隨著現(xiàn)在應(yīng)用越來(lái)越大,我們就不得不考慮流量的問(wèn)題耘斩。

Google也意識(shí)到不斷更新應(yīng)用對(duì)用戶(hù)流量的損耗,于是在Google?I/O上提及了增量升級(jí)桅咆,或者叫差分升級(jí)的方法括授,并在新版本的Google?Play中得到支持。

簡(jiǎn)單的來(lái)說(shuō)岩饼,增量更新是指在進(jìn)行更新操作時(shí)荚虚,只更新需要改變的地方,不需要更新或者已經(jīng)更新過(guò)的地方則不會(huì)重復(fù)更新籍茧,增量更新與完全更新相對(duì)版述。

1.2.增量更新原理

增量升級(jí)的原理其實(shí)不難,我們首先使用舊版本的apk與新版本的apk做差分硕糊,就能得到更新部分的補(bǔ)丁院水,也叫差分包腊徙。這個(gè)差分包雖然不是新舊版本的簡(jiǎn)單相減简十,但顯而易見(jiàn)的是,用戶(hù)不需要全部下載新版本apk了撬腾,我們只要下載更小的那個(gè)補(bǔ)丁包(差分包)螟蝙。

在用戶(hù)下載完差分包后,需要在手機(jī)端將它們組合起來(lái)民傻。一般手機(jī)的應(yīng)用安裝在data/app下胰默,我們可以復(fù)制出就版本apk至SD卡中场斑,與下載好的差分包進(jìn)行組合。最后得到一個(gè)新版本的apk后與服務(wù)器上的新版本進(jìn)行校驗(yàn)牵署,正確后就可以安裝了漏隐。

2.環(huán)境搭建

2.1.NDK下載安裝

NDK(native?develop?kits),是一個(gè)交叉編譯的工具鏈奴迅。交叉編譯是指:在一個(gè)平臺(tái)下(CPU,操作系統(tǒng))可以編譯出在另外一個(gè)平臺(tái)可以運(yùn)行的代碼青责,例如我們正要做的:windows?AMD?intel?x86架構(gòu)->手機(jī)android?arm處理器。

下載地址:http://www.android-doc.com/tools/sdk/ndk/index.html

2.2.Cygwin安裝

Cygwin是一個(gè)可以在windows下模擬出linux環(huán)境的一個(gè)工具取具,NDK必須在linux環(huán)境下進(jìn)行編譯等工作脖隶。

下載地址:http://www.cygwin.com

安裝過(guò)程略。需要注意的是在Selectpackages安裝界面中把Default改為Install暇检,直接點(diǎn)擊Default即可产阱。

完成安裝后,我們啟動(dòng)Cygwin块仆,輸入make??-v命令构蹬,出現(xiàn)如下信息說(shuō)明安裝成功了。

輸入make? -v命令

我們cd到NDK的目錄榨乎,執(zhí)行./ndk-build命令怎燥,出現(xiàn)如下信息則說(shuō)明大功告成。

執(zhí)行./ndk-build命令

2.3.在Eclipse中或MyEclipse中安裝CDT插件(可選)

將下載好的安裝包解壓蜜暑,把features铐姚、plugins目錄下的文件對(duì)應(yīng)的復(fù)制到Eclipse(MyEclipse)中即可,重啟軟件肛捍。

3.實(shí)現(xiàn)過(guò)程

3.1.差分patch文件的生成

首先要生成舊版本和新版本的差分比patch文件隐绵,我們可以借助bsdiff開(kāi)源庫(kù)的windows版本。我們先下載bsdiff壓縮包拙毫,解壓后有以下兩種工具依许。

解壓bsdiff

Bsdiff.exe就是一個(gè)二進(jìn)制差分工具,bspatch.exe就是相應(yīng)的補(bǔ)丁合成工具了缀蹄。我們的增量升級(jí)的差分包峭跳,是要在服務(wù)端完成的,也就是pc端去完成缺前。我們打開(kāi)命令行蛀醉,轉(zhuǎn)到bsdiff所在目錄下,將新舊版本的apk也放到該目錄下衅码,執(zhí)行命令:

bsdiff.exeoldName.apknewName.apkpatch.patch

Patch文件的名字可自己定義拯刁。如測(cè)試程序中的兩個(gè)版本的apk。

測(cè)試

3.2.patch文件放至服務(wù)器

將生成的差分包xx.patch放置到升級(jí)服務(wù)器上逝段,供用戶(hù)下載升級(jí)垛玻。如果多版本割捅,則必須對(duì)不同版本都進(jìn)行差分。如果版本跨度太大帚桩,可以選擇整包升級(jí)亿驾。

測(cè)試中將上一步生成的Update.patch包放在發(fā)布服務(wù)器Tomcat上。

3.3.Android合成新apk

3.3.1.編寫(xiě)本地方法

我們建一個(gè)Android工程账嚎,命名為UpdateDemo颊乘,用來(lái)實(shí)現(xiàn)應(yīng)用增量更新功能。在工程中建一個(gè)包醉锄,編寫(xiě)本地方法乏悄。

編寫(xiě)方法

3.3.2.So文件的調(diào)用

我們首先用NDK編譯出一個(gè)*.so文件。這個(gè)文件網(wǎng)上有編譯好的恳不,可以直接下載使用檩小。附錄中詳述了如何去編譯.so文件。

將下載好的.so文件放置于3.3.1新建的工程目錄libs\armeabi文件夾下烟勋。

.so文件

我們現(xiàn)在就可以調(diào)用patch方法來(lái)合成新apk了规求。在主程序MainAcitivity類(lèi)中加入以下代碼,該代碼就是調(diào)用我們所需的so庫(kù)文件卵惦。

調(diào)用so庫(kù)文件

這里得注意阻肿,我們的so文件前l(fā)ib是系統(tǒng)生成加上去的,所以在調(diào)用中我們只需將名字去掉lib的名字作為參數(shù)沮尿。

3.3.3.配置XML

無(wú)論在下載還是合成刪除中丛塌,我們都必須獲取手機(jī)SD卡的讀寫(xiě)權(quán)限,我們?cè)赨pdateDemo工程中AndroidManifest.xml加入以下代碼畜疾。

AndroidManifest.xml

3.3.4.下載patch差分包

我們?cè)赨pdateDemo工程中加上添加一個(gè)更新按鈕赴邻,實(shí)現(xiàn)點(diǎn)擊按鈕能夠彈出下載選框,點(diǎn)擊下載就可以下載服務(wù)器上的patch包了啡捶。我們?cè)O(shè)定下載的目錄就是SD卡的跟目錄姥敛。運(yùn)行該程序,界面如圖瞎暑。

apk界面

我們點(diǎn)擊更新按鈕彤敛,如下。

更新

3.3.5.復(fù)制舊安裝包

在合成過(guò)程中了赌,我們需要舊安裝包墨榄。在A(yíng)ndroid中非系統(tǒng)程序默認(rèn)安裝在data/app文件夾下,在非root情況下揍拆,我們可以對(duì)其本身安裝包進(jìn)行讀操作渠概,這樣我們就可以將它復(fù)制到SD根目錄下(和之前下載的patch文件同目錄)茶凳。

在下載完成后嫂拴,下載函數(shù)返回DOWN_OVER播揪,線(xiàn)程接到這個(gè)信號(hào)后,調(diào)用PatchThread()函數(shù)筒狠。

主線(xiàn)程

我們?cè)赑atchThread()中調(diào)用復(fù)制舊安裝包backupApplication(String?packageName,?String?dest)方法猪狈。該方法第一個(gè)參數(shù)為安裝包的ID號(hào),如本例中的com.tutor.update辩恼,dest為復(fù)制目標(biāo)路徑雇庙。該方法中,主要函數(shù)如下灶伊。

backupApplication方法

該函數(shù)能夠找到data/app下相應(yīng)的安裝包疆前。

測(cè)試中我們下載完patch文件后,立刻復(fù)制舊安裝包聘萨。

版本更新

我們用360助手查看SD中文件竹椒。

SD中文件

3.3.6.合成新apk

接下來(lái)就可以調(diào)用本地方法合成新apk了。

同樣在PatchThread()函數(shù)中米辐,當(dāng)復(fù)制成功后胸完,我們就可以調(diào)用如下方法了。

合并apk

參數(shù)都是舊翘贮、新和patch文件的路徑赊窥。我們可以用360助手查看,新的apk已經(jīng)合成狸页,我們可以在程序中設(shè)定它的名字锨能。這樣,我們的新apk合成成功芍耘。

新apk合成成功

3.3.7.MD5校驗(yàn)

合成新apk后腹侣,我們無(wú)法預(yù)知它的正確性,在下載或在合成過(guò)程中齿穗,文件都有可能出錯(cuò)傲隶,所以緊接著我們需要對(duì)它進(jìn)行MD5校驗(yàn)。

用MD5校驗(yàn)工具對(duì)服務(wù)器上的新apk進(jìn)行校驗(yàn)窃页,得到校驗(yàn)碼跺株。然后Android端合成新apk后對(duì)新apk也進(jìn)行校驗(yàn)。我們?cè)赨pdateDemo工程中再建一個(gè)包脖卖,編寫(xiě)MD5類(lèi)乒省。

編寫(xiě)MD5

我們?cè)贛ainAcitivity類(lèi)中的PatchThread()函數(shù)中構(gòu)造MD5對(duì)象,調(diào)用check方法即可畦木。

用返回的校驗(yàn)值和服務(wù)器上的校驗(yàn)值對(duì)比袖扛,相同則進(jìn)行安裝,不同則提示校驗(yàn)失敗。

校驗(yàn)失敗

3.3.8.安裝新apk

校驗(yàn)正確后自動(dòng)安裝即可蛆封。緊接著校驗(yàn)函數(shù)唇礁,我們加入判斷,如果校驗(yàn)正確惨篱,則調(diào)用以下方法盏筐;如果錯(cuò)誤,我們就跳出提示信息砸讳。

安裝新apk

安裝完成后打開(kāi)軟件琢融,已經(jīng)是V2版本了,我們?cè)隽扛鲁晒Α?/p>

量更新成功

3.3.9.刪除殘余文件

最后我們只要把用戶(hù)下載的patch文件和舊apk刪除即可簿寂,用戶(hù)最終可以得到新apk漾抬,新apk用戶(hù)可以自行處理。

刪除時(shí)我們只要在安裝后或在校驗(yàn)錯(cuò)誤后調(diào)用delete()函數(shù)即可常遂。

delete()函數(shù)

用助手查看SD目錄奋蔚,只有新apk了。

只有新apk

如果校驗(yàn)不通過(guò)烈钞,所有相關(guān)文件都會(huì)被刪除泊碑。這樣,我們就完成了我們的更新操作毯欣。

4.各種生成差分包大小列表

增量更新雖然不用將新apk的內(nèi)容全部下載馒过,但如果版本相差過(guò)大,或者apk本身非常小酗钞,還是建議下載整包腹忽。以下做了個(gè)小測(cè)試。

生成差分包大小列表

我們能夠觀(guān)察到砚作,當(dāng)apk不足1M時(shí)窘奏,差分包大小同樣也有幾百K,所以沒(méi)必要去差分葫录。當(dāng)版本相差過(guò)大着裹,增加內(nèi)容非常多時(shí),我們也建議直接整包更新米同。差分時(shí)包越大耗時(shí)越長(zhǎng)骇扇。

5.附錄

測(cè)試中我們用到網(wǎng)上已有的so庫(kù),直接調(diào)用即可面粮。我們也可以自己在客戶(hù)端生成so文件少孝。

我們先下載bzip2-1.0.6.tar.gz。新建一個(gè)Android工程熬苍,將可能用到的下列文件復(fù)制到新建的Android工程的jni目錄下(沒(méi)有的新建一個(gè)目錄)稍走。

下載地址:http://www.bzip.org/downloads.html。

bzip2-1.0.6.tar.gz

5.1.Android.mk配置

在該jni目錄下新建文件,命名Android.mk婿脸,配置如下粱胜。

Android.mk

5.2.方法實(shí)現(xiàn)

5.2.1.頭文件生成

打開(kāi)cmd命令行,轉(zhuǎn)到工程目錄的bin文件夾下盖淡,輸入以下命令。

生成頭文件

系統(tǒng)會(huì)自動(dòng)生成一個(gè).h文件凿歼,我們把它拷貝到j(luò)ni目錄下褪迟。

.h文件

5.2.2.編譯成so庫(kù)

我們?cè)趈ni目錄下新建com_example_jni_MainActivity.c,完成c代碼答憔。

com_example_jni_MainActivity.c

打開(kāi)Cygwin味赃,轉(zhuǎn)到工程目錄,使用ndk命令編譯成so庫(kù)即可虐拓。

編譯成so庫(kù)

我們可以看到libBSdiff.so已經(jīng)編譯成功心俗,在lib/armeabi目錄下。

libBSdiff.so

這樣蓉驹,我們就可以使用該so文件去合成新apk了城榛。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市态兴,隨后出現(xiàn)的幾起案子狠持,更是在濱河造成了極大的恐慌,老刑警劉巖瞻润,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喘垂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡绍撞,警方通過(guò)查閱死者的電腦和手機(jī)正勒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)傻铣,“玉大人章贞,你說(shuō)我怎么就攤上這事》侵蓿” “怎么了阱驾?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)怪蔑。 經(jīng)常有香客問(wèn)我里覆,道長(zhǎng),這世上最難降的妖魔是什么缆瓣? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任喧枷,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘隧甚。我一直安慰自己车荔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布戚扳。 她就那樣靜靜地躺著忧便,像睡著了一般。 火紅的嫁衣襯著肌膚如雪帽借。 梳的紋絲不亂的頭發(fā)上珠增,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音砍艾,去河邊找鬼蒂教。 笑死,一個(gè)胖子當(dāng)著我的面吹牛脆荷,可吹牛的內(nèi)容都是我干的凝垛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蜓谋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼梦皮!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起桃焕,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤届氢,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后覆旭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體退子,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年型将,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寂祥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡七兜,死狀恐怖丸凭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腕铸,我是刑警寧澤惜犀,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站狠裹,受9級(jí)特大地震影響虽界,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜涛菠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一莉御、第九天 我趴在偏房一處隱蔽的房頂上張望撇吞。 院中可真熱鬧,春花似錦礁叔、人聲如沸牍颈。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)煮岁。三九已至,卻和暖如春涣易,著一層夾襖步出監(jiān)牢的瞬間画机,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工都毒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留色罚,地道東北人碰缔。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓账劲,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親金抡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瀑焦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • 在前幾年,整體移動(dòng)網(wǎng)絡(luò)環(huán)境相比現(xiàn)在差很多梗肝,加之流量費(fèi)用又相對(duì)較高榛瓮,因此每當(dāng)我們發(fā)布新版本的時(shí)候,一些用戶(hù)升級(jí)并不是...
    涅槃1992閱讀 5,490評(píng)論 2 39
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,104評(píng)論 25 707
  • @[增量更新,差分包,bsdiff/patch] 背景 隨著Android app的不斷迭代升級(jí)巫击,功能越來(lái)越多禀晓,a...
    SunYo閱讀 14,627評(píng)論 2 7
  • 經(jīng)艷子姐介紹加入組織后,真真切切感受到筆友們對(duì)文字的喜愛(ài)弓颈,對(duì)寫(xiě)作的熱情帽芽,不同年齡,不同職業(yè)翔冀,天南海北的人聚在一起导街,...
    半山桃源閱讀 187評(píng)論 5 4
  • 為什么在一起 兩個(gè)人選擇在一起,可以是因?yàn)闊釕俚膼?ài)情纤子,也可以不是因?yàn)殡y以自拔的愛(ài)菊匿。 試想付呕,你...
    青糯君閱讀 621評(píng)論 0 3