Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android App增量更新實例

Android App增量更新實例

編輯:Android開發實例

       介紹

  你所看到的,是一個用於Android應用程序增量更新的開源庫。

  包括客戶端、服務端兩部分代碼。

  原理

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

  Link: http://developer.android.com/about/versions/jelly-bean.html

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與服務器端最新apk進行二進制對比,並得到差分包,用戶更新程序時,只需要下載差分包,並在本地使用差分包與已安裝apk,合成新版apk。

  例如,當前手機中已安裝微博V1,大小為12.8MB,現在微博發布了最新版V2,大小為15.4MB,我們對兩個版本的apk文件查分比對之後,發現差異只有3M,那麼用戶就只需要要下載一個3M的差分包,使用舊版apk與這個差分包,合成得到一個新版本apk,提醒用戶安裝即可,不需要整包下載15.4M的微博V2版apk。

  apk文件的差分、合成,可以通過開源的二進制比較工具bsdiff來實現(Link:http://www.daemonology.net/bsdiff/)

  因為bsdiff依賴bzip2,所以我們還需要用到bzip2(Link:http://www.bzip.org/downloads.html)

  bsdiff中,bsdiff.c用於生成查分包,bspatch.c用於合成文件。

  接下來,我們分開說,需要做3件事。

  1.在服務器端,生成這兩個版本微博的差分包;

  2.在手機客戶端,使用已安裝的舊版apk與這個差分包,合成為一個新版微博apk;

  3.校驗新合成的微博客戶端文件是否完成,簽名時候和已安裝客戶端一致,如一致,提示用戶安裝。

  過程分析

  1 生成差分包

  這一步需要在服務器端來實現,一般來說,每當apk有新版本需要提示用戶升級,都需要運營人員在後台管理端上傳新apk,上傳時就應該由程序生成之前所有舊版本們與最新版的差分包。

  例如: 你的apk已經發布了3個版,V1.0、V2.0、V3.0,這時候你要在後台發布V4.0,那麼,當你在服務器上傳最新的V4.0包時,服務器端就應該立即生成以下差分包:

  V1.0 ——> V4.0的差分包;

  V2.0 ——> V4.0的差分包;

  V3.0 ——> V4.0的差分包;

  ApkPatchLibraryServer工程即為Java語言實現的服務器端查分程序。

  下面對ApkPatchLibraryServer做一些簡單說明:

  1.1 C部分

  ApkPatchLibraryServer/jni 中,除了以下4個:

  com_cundong_utils_DiffUtils.c com_cundong_utils_DiffUtils.h com_cundong_utils_PatchUtils.c com_cundong_utils_PatchUtils.h

  全部來自bzip。

  com_cundong_utils_DiffUtils.c com_cundong_utils_DiffUtils.h

  用於生成差分包。

  com_cundong_utils_PatchUtils.c com_cundong_utils_PatchUtils.h

  用於合成新apk文件。

  其中,com_cundong_utils_DiffUtils.c修改自 bsdiff/bsdiff.c,com_cundong_utils_PatchUtils.c修改自bsdiff/bspatch.c。

  我們在需要將jni中的C文件,build輸出為動態鏈接庫,以供Java調用(Window環境下生成的文件名為libApkPatchLibraryServer.dll,Unix-like系統下為libApkPatchLibraryServer.so,OSX下為libApkPatchLibraryServer.dylib)。

  Build成功後,將該動態鏈接庫文件,加入環境變量,供Java語言調用。

  1.2 Java部分

  com.cundong.utils包,為調用C語言的Java實現; com.cundong.apkdiff包,為apk查分程序的Demo; com.cundong.apkpatch包,為apk合並程序的Demo;

  調用com.cundong.utils.DiffUtils中genDiff()方法,可以通過傳入的新舊apk路徑,得到差分包。

Java代碼
  1. /** 
  2.  * 類說明:     apk diff 工具類 
  3.  *  
  4.  * @author  Cundong 
  5.  * @date    2013-9-6 
  6.  * @version 1.0 
  7.  */  
  8. public class DiffUtils {  
  9.    
  10.     /** 
  11.      * 本地方法 比較路徑為oldPath的apk與newPath的apk之間差異,並生成patch包,存儲於patchPath 
  12.      *  
  13.      * @param oldPath 
  14.      * @param newPath 
  15.      * @param patchPath 
  16.      * @return 
  17.      */  
  18.     public static native int genDiff(String oldApkPath, String newApkPath, String patchPath);  
  19. }  

  調用com.cundong.utils.PatchUtils中patch()方法,可以通過舊apk與差分包,合成為新apk。

Java代碼
  1. /** 
  2.  * 類說明:   APK Patch工具類 
  3.  *  
  4.  * @author  Cundong 
  5.  * @date    2013-9-6 
  6.  * @version 1.0 
  7.  */  
  8. public class PatchUtils {  
  9.   
  10.     /** 
  11.      * native方法 
  12.      * 使用路徑為oldApkPath的apk與路徑為patchPath的補丁包,合成新的apk,並存儲於newApkPath 
  13.      * @param oldApkPath 
  14.      * @param newApkPath 
  15.      * @param patchPath 
  16.      * @return 
  17.      */  
  18.     public static native int patch(String oldApkPath, String newApkPath,  
  19.             String patchPath);  
  20. }  

  2.使用舊版apk與差分包,在客戶端合成新apk

  需要在手機客戶端實現,ApkPatchLibrary工程封裝了這個過程。

  2.1 C部分

  ApkPatchLibrary/jni/bzip2目錄中所有文件都來自bzip2項目。

  ApkPatchLibrary/jni/com_cundong_utils_PatchUtils.c、ApkPatchLibrary/jni/com_cundong_utils_PatchUtils.c實現文件的合並過程,其中com_cundong_utils_PatchUtils.c修改自bsdiff/bspatch.c。

  我們需要用NDK編譯出一個libApkPatchLibrary.so文件,生成的so文件位於libs/armeabi/ 下,其他 Android 工程便可以使用該libApkPatchLibrary.so文件來合成apk。

  2.2 Java部分

  com.cundong.utils包,為調用C語言的Java實現;

  調用,com.cundong.utils.PatchUtils中patch()方法,可以通過舊apk與差分包,合成為新apk。

Java代碼
  1. /** 
  2.  * 類說明:   APK Patch工具類 
  3.  *  
  4.  * @author  Cundong 
  5.  * @date    2013-9-6 
  6.  * @version 1.0 
  7.  */  
  8. public class PatchUtils {  
  9.   
  10.     /** 
  11.      * native方法 
  12.      * 使用路徑為oldApkPath的apk與路徑為patchPath的補丁包,合成新的apk,並存儲於newApkPath 
  13.      * @param oldApkPath 
  14.      * @param newApkPath 
  15.      * @param patchPath 
  16.      * @return 
  17.      */  
  18.     public static native int patch(String oldApkPath, String newApkPath,  
  19.             String patchPath);  
  20. }  

  3.校驗新合成的apk文件

  新包和成之後,還需要對客戶端合成的apk包與最新版本apk包進行MD5或SHA1校驗,如果校驗碼不一致,說明合成過程有問題,新合成的包將不能被安裝。

  注意事項

  增量更新的前提條件,是在手機客戶端能讓我們讀取到當前應用程序安裝後的源apk,如果獲取不到源apk,那麼就無法進行增量更新了。

  另外,如果你的應用程序不是很大,比如只有2、3M,那麼完全沒有必要使用增量更新,增量更新適用於apk包比較大的情況,比如游戲客戶端。

  GitHub地址

  GitHub:https://github.com/cundong/SmartAppUpdates

  一些說明

  源碼中,包含以下文件:

  1.ApkPatchLibraryServer:Java語言實現的,服務器端生成差分包工程;

  2.ApkPatchLibrary:客戶端使用的apk合成庫;

  3.ApkPatchLibraryDemo:引用ApkPatchLibrary Library 的Demo,以新浪微博客戶端的升級為例,假設手機上安裝的是V4.5.0,最新版是V4.5.5,用戶需要從V4.5.0升級到V4.5.5。

  4.TestApk:用於測試的,舊版本的微博客戶端,以及使用ApkPatchLibraryServer生成的新舊新浪微博差分包。

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