Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android APP增量升級的實現方式

Android APP增量升級的實現方式

編輯:關於Android編程

自從 Android 4.1 開始,Google引入了應用程序的增量更新。

Smart app updates is a new feature of Google Play that introduces a better way of delivering app updates to devices. When developers publish an update, Google Play now delivers only the bits that have changed to devices, rather than the entire APK. This makes the updates much lighter-weight in most cases, so they are faster to download, save the device’s battery, and conserve bandwidth usage on users’ mobile data plan. On average, a smart app update is about 1/3 the sizeof a full APK update.

  • 實現原理

增量更新的原理非常簡單,就是將本地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個文件(這裡面可能有的是不需要的,我都拷貝過來了):
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合成新包。

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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved