linux 二进制差分工具,打造Android万能的软件更新库
今日科技快訊
阿里星球今天在蘋果商店發布的更新動態顯示,其將在近期停止APP內的音樂服務,用戶可以通過新版本內的指引和說明,導出本地音樂。這意味著上線八個月后,阿里星球做出了一個重大決定:停止音樂服務后,這款由天天動聽改版而來、承載了阿里音樂鐵三角期望的APP,將徹底與音樂播放器功能告別。
作為宋柯、高曉松以及何炅加盟阿里音樂后準備了大半年推出的平臺,阿里星球承載了阿里音樂鐵三角對音樂業務的重要期望,但從結果來看并不如人意。上線之初,阿里星球便遭遇大量用戶差評。作者簡介
本篇來自 hcy 的投稿,分享了他自己封裝的軟件更新工具。希望能幫助到有需要的朋友。
hcy的博客地址:http://blog.csdn.net/huang_cai_yuan
概述
軟件更新功能可以說是APP的標配。以前實現這個功能的時候,自己一行一行代碼重復擼,浪費時間。所以我決定實現一個萬能的可復用的更新庫。讓它支持增量更新、全量更新、靜默安裝、普通方式安裝、可以自定義UI。下面就來介紹一下我實現這個庫的主要技術點:增量更新、靜默安裝及如何封裝。
軟件增量更新處理流程
服務端處理流程
1.驗證請求的合法性。
2.如果請求不合法(比如請求是模擬的,非客戶端發出的),則拒絕服務。
3.如果請求合法,獲取versionCode等信息,根據versionCode判斷軟件是否更新。
4.如果不需要更新,則返回對應信息。
5.如果需要更新,獲取與versionCode對應的客戶端文件的MD5,判斷該MD5值是否在歷史版本文件的MD5列表中,如果在說明支持增量更新。
6.如果不支持增量更新,則返回完整apk文件的下載鏈接。
7.如果支持增量更新,判斷對應的patch文件是否存在。
8.如果對應的patch文件不存在,調用腳本程序生成對應的patch文件,并返回該patch文件的下載鏈接。
9.如果對應的patch文件存在,則返回該patch文件的下載鏈接。
客戶端處理流程
1.收集apk的基本信息,向服務端發送更新請求。
2.如果沒有更新,則做對應的提示操作。
3.如果有更新,判斷是否是增量更新還是全量更新。
4.如果是全量更新,則下載對應的apk文件,展示相應的UI,安裝apk即可。
5.如果是增量更新,則下載對應的patch文件,展示相應的UI,然后提取客戶端的apk文件到指定目錄并與patch文件合并成一個新的apk文件,判斷新合成的apk文件是否與從服務端獲取的完整的apk文件MD5的值一致,若一致說明合成成功,安裝新合成的apk文件即可,若不一致說明合成失敗,進行安裝失敗的提示。
增量更新的實現
通過上面的處理流程分析,我們發現實現增量更新的難點主要在于patch文件的生成、新apk文件的合成這兩個部分。這里借助開源的bsdiff來實現這兩部分的功能。
1.下載二進制差分、合并工具
增量更新的實現用到第三方庫bsdiff
http://www.daemonology.net/bsdiff
該庫依賴:bzip2
http://www.bzip.org/downloads.html
bsdiff 目前支持Linux、Windows,同時也有Python版本的源碼。
2.服務端patch文件的生成
服務端可以根據需要,選擇對應的版本進行 patch文件 的生成,比如 Windows版本 的生成方式如下:
同時按住Shift+右鍵,選擇“在此處打開命令窗口”,執行命令bsdiff old.apk new.apk patch.patch即可生成patch包,至于腳本怎么執行這些命令,請讀者自行發揮。
3. 客戶端新apk的合成實現
點擊條目1中的鏈接,下載linux版本的源代碼,同時下載bzip2的源代碼,文件目錄結構如下:
接著將bsdiff.c、bspatch.c文件中的main方法改成 diff、patch
然后編寫jni代碼,調用bsdiff和bspatch的diff、patch方法
接下來,在外層的Android.mk文件中編寫 makefile腳本(gradle里面編譯jni我不熟,哈哈哈,還是makefile用著習慣),將bsdiff、bzip2編譯成靜態庫,同時引入 子目錄的Android.mk文件。
在jni_bsdiff目錄下面的Android.mk 文件中編寫生成我們要用的動態庫的腳本如下
再接下來,在build.gradle里面編寫編譯腳本即可:
如果不出意外我們的 libbsdiff_utils.so就可以生成了。然后我們編寫Java層的調用代碼:
新apk文件的合成我們要用到的是patch方法,它的參數 oldPath表示 當前apk的文件路徑,newPath表示 合成后的apk文件路徑,patchPath則為 下載的增量包的路徑。
oldPath的取值,比較穩妥的做法是把當前安裝的apk文件拷貝到一個可讀可寫的目錄,防止bspatch對已安裝的apk文件產生破壞。附上獲取當前apk文件的路徑的代碼:
靜默安裝實現
靜默安裝這里采用pm install 命令實現,因此應用需要獲取到Root權限才能執行成功。
封裝
為了打造一個可復用的軟件更新庫,這里根據軟件更新的流程抽象了五個接口,流程與接口的對應關系如下:更新檢測(UpdateChecker)
更新檢測后的UI提示(UpdateCheckUIHandler)
更新文件下載(Downloader)
文件下載時的UI提示(DownloadUIHandler)
安裝文件(AppInstaller)
如果使用者發現哪一步不符合自己的需求,只要實現這個步驟的接口并注入到全局配置中即可,從而實現“萬能”的軟件更新功能。
具體實現,請參照源碼:https://github.com/Money888/LibUpgrade.git
更新庫的使用
第一步,在 Application.onCreate 方法中進行初始化
@Override
public void onCreate() {
super.onCreate();
LibUpgradeInitializer.init(this);}
第二步,配置更新庫功能
第三步,啟用更新檢查功能
//此處的Context默認必須為ActivityUpdater.getInstance().check(this);
自定義功能擴展使用
1. 增量更新
2. 全量更新
3. 強制更新
4. 普通安裝模式
5. 靜默安裝模式
6. 修改更新時的提示UI
7. 修改文件下載時的UI
其它二進制差分及合并工具xdelta3
http://xdelta.org/xdelta3.htmljavaxdelta
http://javaxdelta.sourceforge.netcourgette
https://chromium.googlesource.com/chromium/src/courgette更多
每天學習累了,看些搞笑的段子放松一下吧。關注最具娛樂精神的公眾號,每天都有好心情。
總結
以上是生活随笔為你收集整理的linux 二进制差分工具,打造Android万能的软件更新库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果手机的声音很小是什么原因
- 下一篇: linux下kegg注释软件,KEGG功