1.增量升級的原理 增量更新的原理就是將本地apk與伺服器端最新版本比對,並得到差異包。比如現在的版本是1.1.4,大小是7.2M,新版本是1.1.5.大小是7.3M。我們發現兩個版本只有0.1M的差異,這樣我們如果採用增量升級生成0.1M左右的差異包,這樣用戶只需要下載0.1M的差異包進行升級而不 ...
1.增量升級的原理
增量更新的原理就是將本地apk與伺服器端最新版本比對,並得到差異包。比如現在的版本是1.1.4,大小是7.2M,新版本是1.1.5.大小是7.3M。我們發現兩個版本只有0.1M的差異,這樣我們如果採用增量升級生成0.1M左右的差異包,這樣用戶只需要下載0.1M的差異包進行升級而不需要重新下載7.3M的新版本了。
2.以往增量升級的實現
首先要有服務端來生成差異包,這一步使用bsdiff(二進位差分工具)來生成老版本和新版本的差異包,再提供給應用下載差異包。應用端則是封裝bspatch成so動態庫,通過jni調用動態庫將舊版本的apk和差異包合成新版本的apk。
3.以往增量升級的弊端
1. 服務端和客戶端都需要實現功能,時間周期長
2. 無法保證用戶每次的及時升級到最新,所以必須對發佈的每一個版本都和最新的版本作成差異包,難以維護。
3. 客戶端下載服務端生成的差異包進行合成,可能會出現合成失敗問題,有可能是服務端生成的差異包不對,也有可能客戶端合成有問題,需要大量的測試和聯調。
4.友盟升級
4.1 導入SDK所需jar包
下載最新版SDK的zip包,將其中的libs文件夾合併到本地工程libs子目錄下。libs目錄下的libs/armeabi/libbspatch.so文件是用於支持增量更新功能的庫文件,也需要在eclipse中添加。
4.2 添加資源文件
將SDK提供的res文件夾拷入工程目錄下, 和工程本身res目錄合併。請不要隨便刪除其中的文件
4.3 配置AndroidManifest.xml
4.3.1 添加SDK需要的許可權到標簽下:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <uses-permission android:name="android.permission.INTERNET"></uses-permission>
4.3.2 接著添加APPKEY和渠道到標簽下: (如果已經集成了統計SDK等友盟其他服務,不需要重覆添加APPKEY)
<meta-data android:value="YOUR APP KEY" android:name="UMENG_APPKEY"/> <meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/>
UMENG_APPKEY:用來定位該應用的唯一性,用您該應用的UMENG APPKEY,替換value中的”YOUR APP KEY”。
UMENG_CHANNEL:用來標註應用推廣渠道,不同渠道可以上傳不同更新包,您可以使用20位以內的英文和數字為渠道定名,替換value中的”Channel ID”。如果不改動,將代表預設渠道,如果需要使用友盟自動更新多渠道更新,必須先集成友盟統計SDK。
4.3.3 添加Service和Activity到標簽下: (請註意:v2.4的SDK中,對話框改為Activity實現,com.umeng包名可能有變,如果不能下載,請檢查包名,替換成正確的包名)
<service android:name="com.umeng.update.net.DownloadingService" android:process=":DownloadingService" > </service> <activity android:name="com.umeng.update.UpdateDialogActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" > </activity>
4.3.4 調用更新介面
主要應用場景:最常見的自動更新模式,當用戶進入應用首頁後,如果處於wifi環境則檢測更新,如果有更新,彈出對話框提示有新版本,用戶點選更新開始下載更新。
在應用程式入口Activity里的OnCreate() 方法中調用
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); UmengUpdateAgent.update(this);
目前預設在Wi-Fi接入情況下才進行自動提醒。如需要在任意網路環境下都進行更新自動提醒,則請在update調用之前添加以下代碼:UmengUpdateAgent.setUpdateOnlyWifi(false)。
4.4 上傳最新的APK
如果開發者已經有了最新的APK版本,只要上傳到友盟網站,同時客戶端版本的版本號(VersionCode)小於上傳的最新版本,客戶端在啟動時就會有更新提示。
5.友盟更新場景
5.1 自動更新
最常見的自動更新模式,當用戶進入應用首頁後,如果處於wifi環境則自動檢測更新(預設只在wifi環境下檢測,是為了用戶流量考慮。這個行為可以更改),如果有更新,彈出對話框提示有新版本,用戶點選更新開始下載更新。
在應用程式入口Activity里的OnCreate() 方法中調用
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); UmengUpdateAgent.update(this) //UmengUpdateAgent.update(this, "appkey", "channel");
5.2 手動更新
主要使用場景:許多應用的設置界面中都會有檢查更新等類似功能,需要用戶主動觸發而檢測更新。它的預設行為基本和自動更新基本一致。
它和自動更新的主要區別是:在這種手動更新的情況下,無論網路狀況是否Wifi,無論用戶是否忽略過該版本的更新,都可以像下麵的示例一樣在按鈕的回調中發起更新檢查,代替update(Context context):
public void onClick(View v) { UmengUpdateAgent.forceUpdate(mContext); }
5.3 靜默下載更新
主要使用場景:當用戶進入應用首頁後如果處於wifi環境檢測更新,如果有更新,後臺下載新版本,如果下載成功,則進行通知欄展示,用戶點擊通知欄開始安裝。
靜默下載中途如果wifi斷開,則會停止下載。
在應用程式入口Activity里的OnCreate() 方法中調用
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); UmengUpdateAgent.silentUpdate(this);
6.友盟增量升級
友盟增量更新的原理是:應用集成友盟自動更新SDK之後,SDK會在應用啟動時將手機端的Version Code和應用APK文件的MD5值發送到友盟的伺服器端。伺服器通過對MD5值查找到老版本的APK, 同新老版本的APK做diff, 生成patch文件,返回給SDK。 SDK再將patch文件和手機上的老版本APK文件合成生成新版本的APK。手機端生成的新版APK文件的MD5值會和伺服器端的新版APK MD5值保持嚴格一致。在此過程中, 要求友盟伺服器必須存在新老兩個版本的APK文件。
友盟預設是採用的增量更新,如果想採用全量更新可以調用setDeltaUpdate(boolean deltaUpdate)設置,預設true,設為false則為全量更新