編輯:關於Android編程
官方說明
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;
這一步需要在服務器端來實現,一般來說,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);
差異包已經在服務器端生成,我們只需要在客戶端提示用戶有更新,然後讓用戶來下載差異包,下載成功之後,
使用本地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)
注意事項
1.新包和成之後,還需要對合成升級版本的apk包及最新版本apk包進行MD5或SHA1校驗,如果校驗碼不一致,說明合成過程有問題,新合成的包將不能被安裝。
2.增量升級成功的前提是,用戶手機端必須有能夠讓你拷貝出來且與你服務器用於差分的版本一致的apk,這樣就存在,例如,系統內置的apk無法獲取到,無法進行增量升級;對於某些與你差分版本一致,但是內容有過修改的(比如破解版apk),這樣也是無法進行增量升級的,為了防止合成補丁錯誤,最好在補丁合成前對舊版本的apk進行校驗,保證基礎包的一致性。
demo
由於我比較懶我就把demo都做到手機上面了,編程成的是so,其實生成補丁應該在服務器這邊。但是我是為了做效果就直接弄在手機上面了。還有提醒一下windows上面做差分可以用windiff來做。
demo下載地址在這裡:這裡Demo
這一篇主要根據上一篇的大致說明,我相信如果看完這一篇,對開發自定義View將會有很大的幫助,先介紹ColorStateList和StateListDrawable兩個類:
網上已經有很多關於Hierarchy Viewer如何使用的文章,這裡就不一步步的演示具體怎樣使用了,ddna兄的《【Android工具】被忽
作為一個成熟的應用, 必須要有廣告. 那麼, 如何優雅地開發廣告呢? 需要注意一些細節.本文提供一個簡單的示例, 代碼僅供參考.需求:1. 下載廣告在歡迎頁面中, 啟動一
ContentProvider,從字面意義上理解,內容提供者,這個類目的就是一個橋梁的作用,讓一個應用的數據(SQLiteDatabase, SharedPreferen