Android App增量更新詳解及實(shí)例代碼
Android App增量更新實(shí)例--Smart App Updates
介紹
你所看到的,是一個(gè)用于Android應(yīng)用程序增量更新的開源庫。
包括客戶端、服務(wù)端兩部分代碼。
原理
自從 Android 4.1 開始,Google引入了應(yīng)用程序的增量更新。
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.
增量更新的原理非常簡單,就是將手機(jī)上已安裝apk與服務(wù)器端最新apk進(jìn)行二進(jìn)制對比,并得到差分包,用戶更新程序時(shí),只需要下載差分包,并在本地使用差分包與已安裝apk,合成新版apk。
例如,當(dāng)前手機(jī)中已安裝微博V1,大小為12.8MB,現(xiàn)在微博發(fā)布了最新版V2,大小為15.4MB,我們對兩個(gè)版本的apk文件查分比對之后,發(fā)現(xiàn)差異只有3M,那么用戶就只需要要下載一個(gè)3M的差分包,使用舊版apk與這個(gè)差分包,合成得到一個(gè)新版本apk,提醒用戶安裝即可,不需要整包下載15.4M的微博V2版apk。
apk文件的差分、合成,可以通過開源的二進(jìn)制比較工具bsdiff來實(shí)現(xiàn)(Link:http://www.daemonology.net/bsdiff/)
因?yàn)閎sdiff依賴bzip2,所以我們還需要用到bzip2(Link:http://www.bzip.org/downloads.html)
bsdiff中,bsdiff.c用于生成查分包,bspatch.c用于合成文件。
接下來,我們分開說,需要做3件事。
1.在服務(wù)器端,生成這兩個(gè)版本微博的差分包;
2.在手機(jī)客戶端,使用已安裝的舊版apk與這個(gè)差分包,合成為一個(gè)新版微博apk;
3.校驗(yàn)新合成的微博客戶端文件是否完成,簽名時(shí)候和已安裝客戶端一致,如一致,提示用戶安裝。
過程分析
1 生成差分包
這一步需要在服務(wù)器端來實(shí)現(xiàn),一般來說,每當(dāng)apk有新版本需要提示用戶升級(jí),都需要運(yùn)營人員在后臺(tái)管理端上傳新apk,上傳時(shí)就應(yīng)該由程序生成之前所有舊版本們與最新版的差分包。
例如: 你的apk已經(jīng)發(fā)布了3個(gè)版,V1.0、V2.0、V3.0,這時(shí)候你要在后臺(tái)發(fā)布V4.0,那么,當(dāng)你在服務(wù)器上傳最新的V4.0包時(shí),服務(wù)器端就應(yīng)該立即生成以下差分包:
V1.0 ——> V4.0的差分包;
V2.0 ——> V4.0的差分包;
V3.0 ——> V4.0的差分包;
ApkPatchLibraryServer工程即為Java語言實(shí)現(xiàn)的服務(wù)器端查分程序。
下面對ApkPatchLibraryServer做一些簡單說明:
1.1 C部分
ApkPatchLibraryServer/jni 中,除了以下4個(gè):
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輸出為動(dòng)態(tài)鏈接庫,以供Java調(diào)用(Window環(huán)境下生成的文件名為libApkPatchLibraryServer.dll,Unix-like系統(tǒng)下為libApkPatchLibraryServer.so,OSX下為libApkPatchLibraryServer.dylib)。
Build成功后,將該動(dòng)態(tài)鏈接庫文件,加入環(huán)境變量,供Java語言調(diào)用。
1.2 Java部分
com.cundong.utils包,為調(diào)用C語言的Java實(shí)現(xiàn); com.cundong.apkdiff包,為apk查分程序的Demo; com.cundong.apkpatch包,為apk合并程序的Demo;
調(diào)用com.cundong.utils.DiffUtils中g(shù)enDiff()方法,可以通過傳入的新舊apk路徑,得到差分包。
Java代碼
/** * 類說明: apk diff 工具類 * * @author Cundong * @date 2013-9-6 * @version 1.0 */ public class DiffUtils { /** * 本地方法 比較路徑為oldPath的apk與newPath的apk之間差異,并生成patch包,存儲(chǔ)于patchPath * * @param oldPath * @param newPath * @param patchPath * @return */ public static native int genDiff(String oldApkPath, String newApkPath, String patchPath); }
調(diào)用com.cundong.utils.PatchUtils中patch()方法,可以通過舊apk與差分包,合成為新apk。
Java代碼
/** * 類說明: APK Patch工具類 * * @author Cundong * @date 2013-9-6 * @version 1.0 */ public class PatchUtils { /** * native方法 * 使用路徑為oldApkPath的apk與路徑為patchPath的補(bǔ)丁包,合成新的apk,并存儲(chǔ)于newApkPath * @param oldApkPath * @param newApkPath * @param patchPath * @return */ public static native int patch(String oldApkPath, String newApkPath, String patchPath); }
2.使用舊版apk與差分包,在客戶端合成新apk
需要在手機(jī)客戶端實(shí)現(xiàn),ApkPatchLibrary工程封裝了這個(gè)過程。
2.1 C部分
ApkPatchLibrary/jni/bzip2目錄中所有文件都來自bzip2項(xiàng)目。
ApkPatchLibrary/jni/com_cundong_utils_PatchUtils.c、ApkPatchLibrary/jni/com_cundong_utils_PatchUtils.c實(shí)現(xiàn)文件的合并過程,其中com_cundong_utils_PatchUtils.c修改自bsdiff/bspatch.c。
我們需要用NDK編譯出一個(gè)libApkPatchLibrary.so文件,生成的so文件位于libs/armeabi/ 下,其他 Android 工程便可以使用該libApkPatchLibrary.so文件來合成apk。
2.2 Java部分
com.cundong.utils包,為調(diào)用C語言的Java實(shí)現(xiàn);
調(diào)用,com.cundong.utils.PatchUtils中patch()方法,可以通過舊apk與差分包,合成為新apk。
Java代碼
/** * 類說明: APK Patch工具類 * * @author Cundong * @date 2013-9-6 * @version 1.0 */ public class PatchUtils { /** * native方法 * 使用路徑為oldApkPath的apk與路徑為patchPath的補(bǔ)丁包,合成新的apk,并存儲(chǔ)于newApkPath * @param oldApkPath * @param newApkPath * @param patchPath * @return */ public static native int patch(String oldApkPath, String newApkPath, String patchPath); }
3.校驗(yàn)新合成的apk文件
新包和成之后,還需要對客戶端合成的apk包與最新版本apk包進(jìn)行MD5或SHA1校驗(yàn),如果校驗(yàn)碼不一致,說明合成過程有問題,新合成的包將不能被安裝。
注意事項(xiàng)
增量更新的前提條件,是在手機(jī)客戶端能讓我們讀取到當(dāng)前應(yīng)用程序安裝后的源apk,如果獲取不到源apk,那么就無法進(jìn)行增量更新了。
另外,如果你的應(yīng)用程序不是很大,比如只有2、3M,那么完全沒有必要使用增量更新,增量更新適用于apk包比較大的情況,比如游戲客戶端。
GitHub地址
GitHub:https://github.com/cundong/SmartAppUpdates
一些說明
源碼中,包含以下文件:
1.ApkPatchLibraryServer:Java語言實(shí)現(xiàn)的,服務(wù)器端生成差分包工程;
2.ApkPatchLibrary:客戶端使用的apk合成庫;
3.ApkPatchLibraryDemo:引用ApkPatchLibrary Library 的Demo,以新浪微博客戶端的升級(jí)為例,假設(shè)手機(jī)上安裝的是V4.5.0,最新版是V4.5.5,用戶需要從V4.5.0升級(jí)到V4.5.5。
4.TestApk:用于測試的,舊版本的微博客戶端,以及使用ApkPatchLibraryServer生成的新舊新浪微博差分包。
通過此文,希望能幫助到有需要的朋友,謝謝大家對本站的支持!
- Android實(shí)現(xiàn)APP在線下載更新
- 基于Retrofit2+RxJava2實(shí)現(xiàn)Android App自動(dòng)更新
- android中強(qiáng)制更新app實(shí)例代碼
- Android實(shí)現(xiàn)簡潔的APP更新dialog數(shù)字進(jìn)度條
- Android應(yīng)用App更新實(shí)例詳解
- Android應(yīng)用APP自動(dòng)更新功能的代碼實(shí)現(xiàn)
- Android如何實(shí)現(xiàn)APP自動(dòng)更新
- Android App實(shí)現(xiàn)應(yīng)用內(nèi)部自動(dòng)更新的最基本方法示例
- android實(shí)現(xiàn)通知欄下載更新app示例
- Android實(shí)現(xiàn)APP自動(dòng)更新功能
相關(guān)文章
非常詳細(xì)的android so庫逆向調(diào)試教程
這篇文章主要給大家介紹了關(guān)于android so庫逆向調(diào)試的相關(guān)資料,文中通過示例代碼以及圖文介紹的非常詳細(xì),對各位Android開發(fā)者具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-08-08ActivityManagerService廣播注冊與發(fā)送示例解析
這篇文章主要為大家介紹了ActivityManagerService廣播注冊與發(fā)送示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Android中Fragment多層嵌套時(shí)onActivityResult無法正確回調(diào)問題的解決方法
這篇文章主要介紹了Android中Fragment多層嵌套時(shí)onActivityResult無法正確回調(diào)問題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09android wifi信號(hào)強(qiáng)度等級(jí)區(qū)分的修改介紹
calculateSignalLevel為計(jì)算信號(hào)等級(jí)函數(shù),MAX_RSSI和MIN_RSSI分別為最強(qiáng)和最弱信號(hào)強(qiáng)度等級(jí)的信號(hào)強(qiáng)度閥值2013-06-06Android實(shí)現(xiàn)向Launcher添加快捷方式的方法
這篇文章主要介紹了Android實(shí)現(xiàn)向Launcher添加快捷方式的方法,涉及Android添加快捷方式的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09Android編程實(shí)現(xiàn)TextView字體顏色設(shè)置的方法小結(jié)
這篇文章主要介紹了Android編程實(shí)現(xiàn)TextView字體顏色設(shè)置的方法,結(jié)合實(shí)例形式總結(jié)分析了Android針對TextView字體顏色設(shè)置的相關(guān)步驟與注意事項(xiàng),具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-12-12Android超詳細(xì)講解組件ScrollView的使用
本節(jié)帶來的是Android基本UI控件中的第十個(gè):ScrollView(滾動(dòng)條),或者我們應(yīng)該叫他?豎直滾動(dòng)條,對應(yīng)的另外一個(gè)水平方向上的滾動(dòng)條:HorizontalScrollView,先讓我們來了解ScrollView2022-03-03