Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android增量更新(打補丁方式)

android增量更新(打補丁方式)

編輯:關於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.

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

    • 實現原理

    其實就是通過兩個版本的相互比較提取出不相同的部分生成一個path就是我們說所的補丁差分包,最後在客戶端進行合成就形成了我們的新版本,因為這樣做的目的是客戶端不必完全下載新版客戶端。只需要通過差分處理就可以了,但是同樣有一個問題就是你們擔心的簽名問題,這個問題在這裡不存在,因為差分處理和合成都是二進制的,所以一切都很好的解決了這個問題。

    • 實現

    以我自己做的一個app為例,名字叫campusv1.apk這個是當前版本,然後我們需要升級到campusv1.1.apk版本。

    弄清楚原理之後,我們就需要解決兩個問題:
    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合成新包。

    使用java開發,通過jni調用C程序(bsdiff、bzip2)。調用生成的庫文件。

    調用,com.bobo.utils.DiffUtils.java中genDiff()方法,可以通過傳入的新(newApkPath)舊(oldApkPath)apk,得到差異包(patchPath)。

    1 public static native int genDiff(String oldApkPath, String newApkPath,String patchPath);

    調用,com.bobo.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這裡給出我的Android.mk文件

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE    := diff
    LOCAL_SRC_FILES := blocksort.c	bzip2.c	bzip2recover.c	bzlib.c	bzlib.h	bzlib_private.h	compress.c	com_bobo_utils_DiffUtils.c	com_bobo_utils_DiffUtils.h	com_bobo_utils_PatchUtils.c	com_bobo_utils_PatchUtils.h	crctable.c	decompress.c dlltest.c	huffman.c	randtable.c spewG.c
    LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
    include $(BUILD_SHARED_LIBRARY)

    如果是在linux下面也可以直接使用make文件把這個東西編譯出來。

    2.調用該so文件。
    任意一個Android工程,使用該so文件,拷貝至libs\armeabi中,便可以調用patch()方法,來和成舊apk+差異包。

    • 注意事項

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

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


    • demo

    由於我比較懶我就把demo都做到手機上面了,編程成的是so,其實生成補丁應該在服務器這邊。但是我是為了做效果就直接弄在手機上面了。還有提醒一下windows上面做差分可以用windiff來做。

    demo下載地址在這裡:這裡Demo


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