淺談Android增量更新服務端的實現(xiàn)方法

這個文章下載的Demo,運行的環(huán)境在Windows下,Linux下有時間我會盡快做好共享給大家參考,其實和客戶端一樣,主要是生成對應的.so文件,調用其中的生成差異方法就行了..

因為項目需要前兩天研究了下增量更新的,如果項目沒有硬性規(guī)定的話,本人推薦使用第三方的SDK.

比如:友盟的增量更新SDK 傳送門http://www.umeng.com/component_update? 分分鐘就能實現(xiàn)Android增量更新功能,友盟官方API相信大家都能看懂,不懂的沒關系之后我也會單獨寫個用友盟的Demo

//TODO 友盟Demo傳送門:

如果你跟我一樣,項目硬性規(guī)定必須自己寫增量更新的代碼,請往下看下面的

●功能版本:

增量更新是Google 4.1增加的新功能

●官方說明

[html] view plaincopy

1.????? Smartapp updates is a new feature of Google Play that introduces a better way ofdelivering app updates to devices. When developers publish an update, GooglePlay now delivers only the bits that have changed to devices, rather than theentire APK. This makes the updates much lighter-weight in most cases, so theyare faster to download, save the device’s battery, and conserve bandwidth usageon users’ mobile data plan. On average, a smart app update is about 1/3 thesizeof a full APK update.

http://developer.android.com/about/versions/jelly-bean.html

●功能背景:

現(xiàn)在的安卓Apk越來越大,而在此之前如果用戶發(fā)現(xiàn)有新版本的話,需要重新把對應程序的新版本下載下來,有時候并不是重大更新,僅僅只是優(yōu)化了一下,用戶就需要重新下載apk,不僅浪費流量而且浪費時間(等同于浪費生命啊,親!!!),有這樣的問題,便會出現(xiàn)更優(yōu)的功能迭代即增量更新或增量升級,或者叫差異化更新,目前很多應用商店已經(jīng)對接了此功能:比如谷歌官方,小米等等

●實現(xiàn)原理:

客戶端與服務端對比,并生成版本之間的差異包,用戶不用下載整個apk文件,只用下載差異包就可以了,比如用戶微博2.0升級到微博3.0,本來微博3.0版本應該是10M,服務器通過生成差異包4M,用戶直接下載4M文件并在本地進行合并生成微博3.0版本,安裝 ,對于網(wǎng)絡環(huán)境較差的用戶絕對提高用戶體驗,節(jié)省流量和時間

●實現(xiàn)思路(服務端+客戶端):

1.客戶端帶著VerisionCode發(fā)送請求給服務端

2.服務端判斷VersionCode是否是最新版本,如果不是檢測是否有此版本和最新版本的差異包,如果沒有則在后臺生成 (舊VersionCode-新VersionCode).patch 文件

3.客戶端收到返回數(shù)據(jù),判斷是否最新,如果不是彈出升級的Dilog對話框

4.點擊立即升級,再次發(fā)送請求

5.服務端返回給客戶端對應版本差異包的Url地址

6.客戶端拿到URL地址下載到SD卡中,并從客戶端data/app目錄下拷貝本程序的apk安裝包,

7.客戶端通過調用JNI編譯的.so動態(tài)鏈接庫中的方法合并舊版本和差異包,生成新版本,調用Intent方法安裝最新的apk包

●用到的知識點:

1.JNI相關(重點)

2.Http協(xié)議相關(次重點)

3.工廠設計模式_調用接口實現(xiàn)類(次重點)

●實現(xiàn)

假設虐急,你的apk已經(jīng)發(fā)布了3個版汹想,1.0,2.0漏健,3.0初澎,這時候你要在后臺發(fā)布4.0秸应,在你上傳時,就應該生成

1.0——>4.0的差異包碑宴;

2.0——>4.0的差異包软啼;

3.0——>4.0的差異包;

選擇使用這個開源二進制比較工具來實現(xiàn):

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

下載后得到bsdiff-4.3.tar.gz延柠。

其中bsdiff.c是二進制文件比對的代碼祸挪;bspatch.c是二進制文件合成的代碼;

我們將使用這個bsdiff來生成兩個apk的patch包捕仔,并且使用bspatch.c來合成舊apk與patch包匕积;

使用bsdiff、bspatch時榜跌,還需用到bzip2: http://www.bzip.org/downloads.html

下載后得到:bzip2-1.0.6.tar.gz闪唆。

我們需要用到bzip2-1.0.6.tar.gz中以下13個文件(這里面可能有的是不需要的,我都拷貝過來了):

[plain]view plaincopy

01?blocksort.c

02?bzip2.c

03?bzip2recover.c

04?bzlib_private.h

05?bzlib.c

06?bzlib.h

07?compress.c

08?crctable.c

09?decompress.c

10?dlltest.c

11?huffman.c

12?randtable.c

13?spewG.c

將這13個文件拷貝至jni目錄下钓葫,接下來悄蕾,我們就調用bsdiff生成差異包,并且調用bspatch合成新包础浮。

服務端解決問題:

1)??????服務端生成對應的差異包

一.??生成差異包的工具類

在你需要的地方調用一下就行了,主要的工具就是bsdiff.exe這個工具

[java]view plaincopy

/**

*?思路:?通過傳遞的oldApk和newApk生成差異包,并返回一個Url地址

*

*?@author?duguang

*?@date?2013.12.29

*?@version?1.0

*?@boke?http://blog.csdn.net/duguang77

*

*/

publicclassBsdiffUtil?{

/**

*?通過傳遞的oldApk和newApk生成差異包,并返回一個Url地址

*

*?@param?oldApk

*???????????客戶端上的舊版本號

*?@param?newApk

*???????????服務器上最新的版本號

*?@return

*/

publicstatic?String?getPatchUrl(String?oldApk,?String?newApk)?{

//bsdiff工具地址,放在自己服務器對應的地址下就行了

Stringbsdiff?="D:/apache-tomcat-7.0.40/webapps/UpApk/upload/bsdiff";

//舊apk的地址位置

StringoldFilePath?="D:/apache-tomcat-7.0.40/webapps/UpApk/upload/"

+oldApk?+".apk";

//新apk的地址位置

StringnewFilePath?="D:/apache-tomcat-7.0.40/webapps/UpApk/upload/"

+newApk?+".apk";

//生成差異包地址位置

StringpatchFilePath?="D:/apache-tomcat-7.0.40/webapps/UpApk/upload/"

+oldApk?+"-"+?newApk+".patch";

Stringurl?=null;

try{

url="http://10.0.2.2:8080/UpApk/upload/"+?oldApk

+"-"+?newApk?+".patch";

Filefile?=newFile(url);

System.out.println(url);

if(file.exists()){

returnurl;

}else{

Runtimert?=?Runtime.getRuntime();

rt.exec(bsdiff+"?"+?oldFilePath?+"?"+?newFilePath?+"?"

+patchFilePath);

}

//rt.exec("d:/bsdiff?d:/old.apk?d:/new.apk?d:/patch.patch");

}catch(IOException?e)?{

e.printStackTrace();

}

returnurl;

}

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(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
  • 正文 為了忘掉前任逸贾,我火速辦了婚禮陨仅,結果婚禮上,老公的妹妹穿的比我還像新娘铝侵。我一直安慰自己灼伤,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布咪鲜。 她就那樣靜靜地躺著狐赡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疟丙。 梳的紋絲不亂的頭發(fā)上颖侄,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音享郊,去河邊找鬼览祖。 笑死,一個胖子當著我的面吹牛炊琉,可吹牛的內容都是我干的展蒂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼苔咪,長吁一口氣:“原來是場噩夢啊……” “哼锰悼!你這毒婦竟也來了?” 一聲冷哼從身側響起团赏,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤箕般,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后舔清,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丝里,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡可柿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了丙者。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡营密,死狀恐怖械媒,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情评汰,我是刑警寧澤纷捞,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站被去,受9級特大地震影響主儡,放射性物質發(fā)生泄漏。R本人自食惡果不足惜惨缆,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一糜值、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坯墨,春花似錦寂汇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至耍攘,卻和暖如春榕栏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蕾各。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工像啼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留猖闪,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像碟嘴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子眶拉,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容

  • 因為項目需要前兩天研究了下增量更新的,如果項目沒有硬性規(guī)定的話,本人推薦使用第三方的SDK. 比如:友盟的增量更新...
    Ten_Minutes閱讀 9,842評論 1 16
  • 增量更新在Android開發(fā)中是一種很常見的技術脆贵。 增量更新的原理 增量更新的原理非常簡單医清,就是將本地apk與服務...
    re冷星閱讀 1,561評論 3 3
  • 在前幾年,整體移動網(wǎng)絡環(huán)境相比現(xiàn)在差很多卖氨,加之流量費用又相對較高会烙,因此每當我們發(fā)布新版本的時候负懦,一些用戶升級并不是...
    涅槃1992閱讀 5,470評論 2 39
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,509評論 25 707
  • 以一貫之,忠恕而己柏腻,大愛無私纸厉,仁者愛人
    卓學智閱讀 177評論 0 0