Android App補丁更新
移動互聯(lián)網主打的就是用戶體驗和產品的快速迭代,通過用戶反饋和用戶行為跟蹤及時調整產品方向,這樣才能持續(xù)保持生命力和創(chuàng)造力。說的接地氣點就是,你頻繁的升級更新,有時只是修復了幾個bug或者微調了下界面,就讓用戶下載10幾兆甚至更大的apk,而且在目前國內這個4G還不是普及的時候,對用戶來說是很不友好的。有沒有這樣一種策略呢,就如windows系統(tǒng)上打補丁一樣,通過體積比較小的補丁來完善系統(tǒng)存在的bug或者新功能的實現(xiàn),如果可以實現(xiàn)的話,用戶就再不會苦著臉去更新app了。答案是肯定的,要實現(xiàn)這個功能,需要以下兩個步驟。
一、比對新版本與老版本之間的差異,***只下載差異的部分
思路很簡單,也非常清晰,那我們就照著這個目標行進。apk本身其實是一個zip壓縮包,你改下后綴名,再雙擊解壓就能得到apk內部的編譯打包后的文件,圖片音頻等文件是直接可以可讀的,其他的就得通過反編譯工具去查看了。所以我們應用的安裝文件apk就是一個二進制文件,如何得到兩個二進制文件的差異文件---差異包呢?好消息是已經有前人實現(xiàn)了,它的名字bsdiff,一個差異包比較工具,全稱是binary diff,二進制差異的意思。通過bsdiff,我們就能得到兩個apk的差異包了,下面我會把整理的命令文件打包到代碼中上傳Github上供大家使用的。bsdiff為我們提供的僅是一組用C實現(xiàn)的代碼,需要自己去編譯構建,我已經為大家準備了windows、OSX、Linux不同平臺下使用的命令。
由于我的電腦是macbook,執(zhí)行命令如下
執(zhí)行命令之后,得到xx.patch,我們下面要下載的就是這個差異包。根據(jù)不同版本之間的差異,相對整個apk來說,差異包的體積會小很多。同時如果你 的應用老版本有多個的話,你就需要生成對應的多個差異包。如果要想生成的流程自動化的話,找后臺的哥們配合下就能輕松解決。
二、手機本地下載差異包,再和舊版本apk進行合并,***合并成新版本apk。
根據(jù)當前版本號,向服務器發(fā)起請求,就得下載到對應的差異包。下面就是舊版本apk和patch合并的一步了,由于java本身并沒有提供相應的api, 我們需要C去幫助實現(xiàn),然后生成.so包進行調用。相對于生成差異包的bsdiff,也給提供了另一個bspatch,這個就是幫助我們進行文件和平的。 如果要在Android中實現(xiàn)這一步,就需要去配置NDK的開發(fā)環(huán)境了,如果不想的同學可以直接把demo里面的.so文件拿出來用。調用下面的這個方法 就可以實現(xiàn)文件的合并
合并出的apk文件,與***的安裝包并無區(qū)別,具有同樣的特征值。***通過Intent進行安裝。
寫在***:有可能有的用戶所使用的版本比較老,與***的apk相差很大的話,還是建議根據(jù)生成差異包的大小進行判定是否去直接下載apk進行更新。同時根 據(jù)不同版本對應不一樣的差異包,和后端的小伙伴合作去自動化生成的話,大大減少了生成差異包時間上的浪費。***如果只是修復關鍵性bug或者幾個新需求的 添加,產生的差異包會很小,也會大大的減少了用戶的下載時間和流量消耗。
源碼地址:https://github.com/JackCho/AndroidPatchUpdate
本文鏈接:http://my.oschina.net/jack1900/blog/301330