廣州暨華電腦學校
咨詢熱線:020-85566216

誠        毅        精      勤

當前位置:所在位置: 廣州電腦培訓 >> 電腦技術 >> android >> 正文

淺析android應用增量升級

發布時間:2018/2/26 15:00:50 內容來源::廣州暨華電腦學校 點擊:

  背景

  隨著android應用體積的不斷增大,以及應用版本發布的不斷更迭,用戶的升級成了一個問題,google也意識到不斷更新應用對用戶流量的損耗,在Google I/O 上提及的 Smart App update,即應用增量升級,或者叫做差分升級的做法,并在新版本的Google Play中得到支持,某天在和群友聊天是扯到這方面的話題,好奇就稍微研究了一下。

  增量升級的原理

  今天我們就來實現類似的應用的增量升級。其實增量升級的原理很簡單,即首先將應用的舊版本Apk與新版本Apk做差分,得到更新的部分的補丁,例如舊版本的APK有5M,新版的有8M,更新的部分則可能只有3M左右(這里需要說明的是,得到的差分包大小并不是簡單的相減,因為其實需要包含一些上下文相關的東西),使用差分升級的好處顯而易見,那么你不需要下載完整的8M文件,只需要下載更新部分就可以,而更新部分可能只有3、4M,可以很大程度上減少流量的損失。

  在用戶下載了差分包之后,需要在手機端將他們組合起來。可以參考的做法是先將手機端的舊版本軟件(多半在/data/下),復制到SD卡或者cache 中,將它們和之前的差分patch進行組合,得到一個新版本的apk應用,如果不出意外的話,這個生成的apk和你之前做差分的apk是一致的。

  增量升級的操作

  在了解基本的原理之后,我們來逐步解決其中的各個難點。首先是差分包patch的生成。如果做過android手機OTA升級的同學應該注意到,在 update.zip中的patch文件夾中有需要與系統文件同名但是以xxx.p 為后綴的文件,他們就是生成的差分patch文件。我們可以借鑒OTA系統升級的差分生成工具來生成我們單個應用apk的差分patch文件。

  OTA系統差分包的制作,使用命令:

  1./build/tools/releasetools/ota_from_target_files -n -i <舊包> <新包> <差分包名>

  在查閱ota_from_target_files 的代碼可知,是在函數WriteIncrementalOTAPackage里生成差分包的,在這個函數里邊創建了common.Difference這個類,我們繼續跟進,在common.py中的類 class Difference(object):里可以看到:

  1diff_program = DIFF_PROGRAM_BY_EXT.get(ext, "bsdiff")

  至此我們就看到了android中提供我們用來制作差分增量升級包的工具,"bsdiff",這是一個很牛X開源的二進制差分工具.相關的介紹傳送門

  相關的代碼地址 或者在android的代碼目錄下 \external\bsdiff

  bsdiff是二進制差分工具,其對應的bspatch是相應的補丁合成工具

  需要注意的是增量升級的補丁包,是需要在服務器端,即PC端完成,大致流程如,制作補丁時調用bsdiff函數,根據兩個不同版本的二進制文件,生成補丁文件。

  1

  2命令:bsdiff oldfile newfile patchfile

  例如: bsdiff xx_v1.0.apk xx_v2.0.apk xx.patch

  將生成的補丁包 xx.patch放置在升級服務器上,供用戶下載升級,對應多版本需要對不同的版本進行差分,對于版本跨度較大的,建議整包升級。

  用戶在下載了 xx.patch補丁包后,需要用到補丁所對應的apk,即原來系統安裝的舊版本apk和補丁合成的bspatch工具。系統舊版本的apk可以通過 copy系統data/app目錄下的apk文件獲取,而補丁合成的bspatch可以通過將bspatch源碼稍作修改,封裝成一個so庫,供手機端調用。

  1

  2bspatch的命令格式為:

  bspatch oldfile newfile patchfile

  和差分時的參數一樣。合成新的apk便可以用于安裝。

  以上只是簡單的操作原理,增量升級還涉及很多其他方面,例如,升級補丁校驗等問題,可以參考android源碼中bootable\recovery\applypatch的相關操作,本文只是淺析,在此不表。

  不足

  增量升級并非完美無缺的升級方式,至少存在以下兩點不足:

  1.增量升級是以兩個應用版本之間的差異來生成補丁的,你無法保證用戶每次的及時升級到最新,所以你必須對你所發布的每一個版本都和最新的版本作差分,以便使所有版本的用戶都可以差分升級,這樣操作相對于原來的整包升級較為繁瑣,不過可以通過自動化的腳本批量生成。

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

  • 上一篇電腦技術:
  • 下一篇電腦技術:
  • 學校簡介 |專業課程 | 學生就業 | 參觀學校

    學校地址:廣州天河區五山路金華園區C座3樓307(華南理工大學南門旁)

    學校名稱:廣州暨華電腦培訓學校 聯系電話:020-85566215

    2002-2019 廣州青大教育信息咨詢有限公司 版權所有 備案/許可證編號為:粵ICP備11083420號-11

    今天30选5开奖公告