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

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

因?yàn)轫?xiàng)目需要前兩天研究了下增量更新的,如果項(xiàng)目沒(méi)有硬性規(guī)定的話,本人推薦使用第三方的SDK.

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

//TODO 友盟Demo傳送門(mén):

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

●功能版本:

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

●官方說(shuō)明

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

●實(shí)現(xiàn)原理:

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

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

1.客戶端帶著VerisionCode發(fā)送請(qǐng)求給服務(wù)端

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

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

4.點(diǎn)擊立即升級(jí),再次發(fā)送請(qǐng)求

5.服務(wù)端返回給客戶端對(duì)應(yīng)版本差異包的Url地址

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

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

●用到的知識(shí)點(diǎn):

1.JNI相關(guān)(重點(diǎn))

2.Http協(xié)議相關(guān)(次重點(diǎn))

3.工廠設(shè)計(jì)模式_調(diào)用接口實(shí)現(xiàn)類(次重點(diǎn))

●實(shí)現(xiàn)

假設(shè),你的apk已經(jīng)發(fā)布了3個(gè)版,1.0,2.0,3.0,這時(shí)候你要在后臺(tái)發(fā)布4.0,在你上傳時(shí),就應(yīng)該生成

1.0——>4.0的差異包;

2.0——>4.0的差異包;

3.0——>4.0的差異包;

選擇使用這個(gè)開(kāi)源二進(jìn)制比較工具來(lái)實(shí)現(xiàn):

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

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

其中bsdiff.c是二進(jìn)制文件比對(duì)的代碼;bspatch.c是二進(jìn)制文件合成的代碼;

我們將使用這個(gè)bsdiff來(lái)生成兩個(gè)apk的patch包,并且使用bspatch.c來(lái)合成舊apk與patch包;

使用bsdiff、bspatch時(shí),還需用到bzip2: http://www.bzip.org/downloads.html

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

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

[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個(gè)文件拷貝至jni目錄下,接下來(lái),我們就調(diào)用bsdiff生成差異包,并且調(diào)用bspatch合成新包。

服務(wù)端解決問(wèn)題:

1)??????服務(wù)端生成對(duì)應(yīng)的差異包

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

在你需要的地方調(diào)用一下就行了,主要的工具就是bsdiff.exe這個(gè)工具

[java]view plaincopy

/**

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

*

*?@author?duguang

*?@date?2013.12.29

*?@version?1.0

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

*

*/

publicclassBsdiffUtil?{

/**

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

*

*?@param?oldApk

*???????????客戶端上的舊版本號(hào)

*?@param?newApk

*???????????服務(wù)器上最新的版本號(hào)

*?@return

*/

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

//bsdiff工具地址,放在自己服務(wù)器對(duì)應(yīng)的地址下就行了

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;

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 因?yàn)轫?xiàng)目需要前兩天研究了下增量更新的,如果項(xiàng)目沒(méi)有硬性規(guī)定的話,本人推薦使用第三方的SDK. 比如:友盟的增量更新...
    Ten_Minutes閱讀 9,914評(píng)論 1 16
  • 增量更新在Android開(kāi)發(fā)中是一種很常見(jiàn)的技術(shù)。 增量更新的原理 增量更新的原理非常簡(jiǎn)單,就是將本地apk與服務(wù)...
    re冷星閱讀 1,669評(píng)論 3 3
  • 在前幾年,整體移動(dòng)網(wǎng)絡(luò)環(huán)境相比現(xiàn)在差很多,加之流量費(fèi)用又相對(duì)較高,因此每當(dāng)我們發(fā)布新版本的時(shí)候,一些用戶升級(jí)并不是...
    涅槃1992閱讀 5,576評(píng)論 2 39
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,056評(píng)論 25 709
  • 以一貫之,忠恕而己,大愛(ài)無(wú)私,仁者愛(ài)人
    卓學(xué)智閱讀 195評(píng)論 0 0

友情鏈接更多精彩內(nèi)容