Android 增量升級學習使用記錄
Android 增量升級原理以及實現測試
好久沒有發部落格了,現在工作忙了,底層程式碼跟蹤學習的東西很久沒有做成文件了,雖然部落格寫的爛,但是再寫的過程中,能更清晰的認識到自己那個地方還不清晰,不明白。這樣能更好的嘴一個反饋和記錄。所以,還是要繼續努力……
Android增量升級,一個比較好玩的內容,幾年前做專案的時候做過預研,但是沒有真正應用到專案中去。所以僅僅測試了一下,但是那時候感覺增量升級好像不怎麼靠譜,就沒有繼續深入。這一次由於系統要求android必須要有增量升級,所以又撿起來學習一下。當然核心的庫用的是第三方,我們也只是在拾人牙慧,將其應用到自己系統中而已。所有參考資料見最後。
1. 增量升級原理
增量升級的原理比較簡單,主要是比較兩個不同版本的二進位制檔案,然後生成兩個版本的差分包,再將差分包與低版本合成即可生成高版本的安裝apk檔案。具體實現細節如下下節。
2. 增量升級實現
增量升級按照原理所述,要先生成差分包,在合成差分包。一般生成差分包是在後臺伺服器生成,合成差分包是在android機器本地合成。差分包主要指的是新版本(V1)與android機器上已經安裝的老版本(V0)之間的差分,為了方便測試,我們模擬伺服器端(server)生成差分包(V1-V0=P),然後在本地端(local)合成包(V1)。當然在差分,合成的時候還有一些細節,比如MD5驗證等。具體的流程如下圖所示:
如上圖所示,其中填充淡黃色的是server端的流程,主要是生成差分包和MD5值,剩下的是android手機local端流程,該流程是一個比較完成的升級流程。我們在做測試的時候不用這麼多流程,只要完成差分包、合成包、MD5校驗、成功安裝即可。下面將按照功能分成兩個部分來做測試,一部分是模擬server端,一部分是android手機local端。
2.1 Server端實現
(1) 生成差分so包
主要的C部分程式碼來自參考地址1,這裡只是自己生成標頭檔案和標頭檔案的實現檔案,標頭檔案實現檔案也參考地址1中的程式碼。這裡僅僅改了包名。
首先建立工程,新增java類DiffUtils,工程與程式碼如下:
然後,用javah命令生成標頭檔案,當然可以自己配置eclipse一鍵生成,javah命令如下:
javah -jni -encoding utf-8 com.woniu.difflibrary.DiffUtils
執行命令以後如果沒錯無,重新整理工程可以發現多了一個頭檔案,在工程目錄下建立jni資料夾,將標頭檔案拷貝到jni下面,然後將參考地址1中的實現程式碼考進來,注意,將參考程式碼中的h標頭檔案換成自己剛剛生成的。
現在,將差分包需要的第三方c程式碼都拷貝到jni目錄下,整個工程目錄如下:
第三步,就是編寫mk檔案並利用ndk生成so包,mk檔案包括上圖所示的Android.mk還有Application.mk。
Application的mk檔案主要是配置生成so包的環境。我們要生成arm和x86的,所以配置如下:另外兩個引數表示當前適配版本以及使用的是STLport靜態連線庫,配置項引數意義以及其他引數值可自行百度google。
Android.mk在這邊配置比較簡單,就是將實現檔案加進來WoniuAPKDiffLibrary就是生成的so包的名稱:libWoniuAPKDiffLibrary.so
最後,到android.mk的目錄下執行nkd-build命令,ndk的配置可以搜一下,比較簡單。執行結束,如果沒有錯誤就可生成兩個libWoniuAPKDiffLibrary.so檔案,分別是arm和x86平臺下的。如下入的兩個so包。如果使用so包現將其拷貝到jni下面分別放到armeabi和x86下。
(2) 生成差分包
上面已經生成差分工具so包,下面就是將其加入到模擬server的工程中,模擬生成差分包。
首先,建立工程,將so包以及生成h檔案的java工具類也拷貝到工程中,工程目錄如下,其中so包,DiffUtils.java是上一個步驟建立生成的。
然後,自己可以隨便寫個小的android應用程式,並生成V0.apk,然後做一個簡單的介面修改,再生成V1.apk,用這兩個apk模擬差分包生成。拷貝到android手機的sdcard中。
最後,執行上述的工程,並點選start,如果沒有出錯將會在sdcard中生成一個V0_to_V01.patch的差分包檔案。該檔案大小隻有原包大小的三分之一。也就是增量升級中需要的差分包。
(3) Server端小結
實際上server端的主要功能已經完成了,就是生成一個差分包。實際使用中,server端還要負責生成V1版本的MD5檔案,如流程圖中所示。而在我們測試中,可以將V1的MD5檔案生成好並儲存下來。便於合成差分包以後校驗。
2.2 Local端實現
實際上,Local端的操作步驟已經與Server端比較類似,也是先生成so包,然後將so包以及相關檔案拷貝的合成工程的實現程式碼中,並用V0和Server端生成的V0_to_V1.patch差分包合成一個V1’,然後V1’與原來的V1本尊的MD5值進行校驗,如果校驗通過,就表示合成成功,否則合成失敗。成功了就直接安裝,替換老版本的V0,失敗以後,在正式環境中就要重新下載V1程式碼。下面簡單看下具體流程:
(1) 生成合成so包
So包的生成方法與查分so包生成的步驟一樣,需要先建立一個工程,然後生成h標頭檔案和實現檔案。具體操作按照上述執行即可。其中工程內容如下:
(2) 生成合成包
建立本地測試程式碼,注意實際使用中一般是對自己本身生成差分包,這裡為了方便測試,用local程式測試其他應用。所以實際使用的時候安裝完以後需要將自身的apk拷貝到一個目錄下做備份,好為後續的增量升級做準備。這裡就用V0代替了。V0放到sdcard下面,V0_to_V1.patch也在該目錄下。Local測試程式只要將測試V0與差分包合成就行。
工程目錄如下:
其中包括一些MD5值獲取校驗等工具類。MainActivity中,用一個Task去執行合成程式碼,合成以後會進行MD5值校驗,所以測試之前可以先將MD5值做好,放到程式碼中寫死。因為這個再實際使用中是由後臺做好,然後通過介面獲取得來的。
(3) Local端小結
這裡就是是呼叫so包進行合成二進位制檔案,合成以後與原來的apk包的MD5做對比校驗。校驗以後可以安裝。實際使用中要把自身的apk先拷貝到增量升級路徑下,然後與下載下來的patch檔案進行合併,然後在做校驗安裝。這樣就完成了本地的操作了。
3. 增量升級總結
增量升級,主要核心的東西,是那些C寫的程式碼,我們要做的就是呼叫別人寫好的東西,然後將流程優化,並正式用於生產環境。上述用到的程式碼,實際上在參考地制止都有。我只是根據修妖做了修改。具體程式碼如下:
繼續努力,keep moving!!