閱讀249 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Android APP增量升級的實現方式

實現原理
增量更新的原理非常簡單,就是將本地apk與服務器端最新版本比對,並得到差異包,用戶更新App時隻需要下載差異包。例如,當前安裝新浪微博V3.5,12.8 MB,新浪微博最新版V4.0,15.4MB,經過對兩個版本比較之後,發現差異隻有7、8M,這時候用戶更新的時候隻需要下載一個7、8M的差異包便可,不需要整包下載15.4M的新版微博客戶端。下載差異包後,在手機端使用舊版apk+差異包,合成得到微博最新版V4.0,提醒用戶安裝即可。 


實現
以新浪微博客戶端的升級為例,假設手機上安裝的是V3.5,現在最新版是V4.0,用戶需要從V3.5升級到V4.0。 


弄清楚原理之後,我們就需要解決兩個問題: 
1.如何比對兩個版本的apk生成差異包; 
2.如何使用舊的apk+差異包,生成一個新apk; 


(1)生成差異包




這一步需要在服務器端來實現,一般來說,apk有新版本之後,需要往後台管理端上傳新apk,上傳時就應該生成每一個舊版與最新版本的差異包。 
假設,你的apk已經發布了3個版,1.0,2.0,3.0,這時候你要在後台發布4.0,在你上傳時,就應該生成 
1.0——>4.0的差異包; 
2.0——>4.0的差異包; 
3.0——>4.0的差異包; 


選擇使用這個開源二進製比較工具來實現: 
https://www.daemonology.net/bsdiff/ 
下載後得到bsdiff-4.3.tar.gz。 


其中bsdiff.c是二進製文件比對的代碼;bspatch.c是二進製文件合成的代碼; 
我們將使用這個bsdiff來生成兩個apk的patch包,並且使用bspatch.c來合成舊apk與patch包; 


使用bsdiff、bspatch時,還需用到bzip2: https://www.bzip.org/downloads.html  
下載後得到:bzip2-1.0.6.tar.gz。 

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

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合成新包。 


我是在Mac下做的,使用java開發,通過jni調用C程序(bsdiff、bzip2)。 


調用,com.cundong.utils.DiffUtils.java中genDiff()方法,可以通過傳入的新(newApkPath)舊(oldApkPath)apk,得到差異包(patchPath)。 
1
public static native int genDiff(String oldApkPath, String newApkPath,String patchPath);調用,com.cundong.utils.PatchUtils.java中patch()方法,可以通過舊apk(oldApkPath)與差異包(patchPath),得到新apk(newApkPath)。
1
public static native int patch(String oldApkPath, String newApkPath,String patchPath);
(2)使用舊apk+差異包,在客戶端合成新apk




差異包已經在服務器端生成,我們隻需要在客戶端提示用戶有更新,然後讓用戶來下載差異包,下載成功之後, 
使用本地apk與差異包,生成新版apk。 


這一步需要在Android應用中開發。 
1.首先NDK編譯出一個*.so,APKPatch工程負責生成 libapkpatch so,生成的so文件位於APKPatch/libs/libapkpatch.so下,其他Android工程便可以使用該so文件來合成apk。 


2.調用該so文件。 
任意一個Android工程,使用該so文件,拷貝至libs\armeabi中,便可以調用patch()方法,來和成舊apk+差異包。 
附件中,test工程,就是一個調用該so文件的例子。 
注意事項
1.新包和成之後,還需要對合成升級版本的apk包及最新版本apk包進行MD5或SHA1校驗,如果校驗碼不一致,說明合成過程有問題,新合成的包將不能被安裝。 


2.增量升級成功的前提是,用戶手機端必須有能夠讓你拷貝出來且與你服務器用於差分的版本一致的apk,這樣就存在,例如,係統內置的apk無法獲取到,無法進行增量升級;對於某些與你差分版本一致,但是內容有過修改的(比如破解版apk),這樣也是無法進行增量升級的,為了防止合成補丁錯誤,最好在補丁合成前對舊版本的apk進行校驗,保證基礎包的一致性。 

最後更新:2017-04-03 12:55:01

  上一篇:go 多柱漢諾塔最優算法設計探究
  下一篇:go Visual Studio調試裏麵的F10和F11有什麼區別