這個文章下載的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;
}
}