編輯: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代碼調用com.cundong.utils.PatchUtils中patch()方法,可以通過舊apk與差分包,合成為新apk。
Java代碼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代碼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生成的新舊新浪微博差分包。
本文實例講述了Android編程使WebView支持HTML5 Video全屏播放的解決方法。分享給大家供大家參考,具體如下: 1)需要在AndroidManif
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我