天天看點

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的差異包; 

選擇使用這個開源二進制比較工具來實作: 

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個檔案(這裡面可能有的是不需要的,我都拷貝過來了): 

<code>blocksort.c</code>

<code>02</code>

<code>bzip2.c</code>

<code>03</code>

<code>bzip2recover.c</code>

<code>04</code>

<code>bzlib_private.h</code>

<code>05</code>

<code>bzlib.c</code>

<code>06</code>

<code>bzlib.h</code>

<code>07</code>

<code>compress.c</code>

<code>08</code>

<code>crctable.c</code>

<code>09</code>

<code>decompress.c</code>

<code>10</code>

<code>dlltest.c</code>

<code>11</code>

<code>huffman.c</code>

<code>12</code>

<code>randtable.c</code>

<code>13</code>

<code>spewg.c</code>

将這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)。

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進行校驗,保證基礎包的一緻性。 

繼續閱讀