Android App補丁更新


上一周比較忙,忙的不可開交,寫的文章也就兩篇,在此希望大家見諒。這周呢,突然閑下來了,有時間了,就重構了下代碼,搗鼓點前衛的技術,沉淀沉淀。所以呢,今天就分享下這幾天研究的東西。

移動互聯網主打的就是用戶體驗和產品的快速迭代,通過用戶反饋和用戶行為跟蹤及時調整產品方向,這樣才能持續保持生命力和創造力。說的接地氣點就是,你頻繁的升級更新,有時只是修復了幾個bug或者微調了下界面,就讓用戶下載10幾兆甚至更大的apk,而且在目前國內這個4G還不是普及的時候,對用戶來說是很不友好的。有沒有這樣一種策略呢,就如windows系統上打補丁一樣,通過體積比較小的補丁來完善系統存在的bug或者新功能的實現,如果可以實現的話,用戶就再不會苦着臉去更新app了。答案是肯定的,要實現這個功能,需要以下兩個步驟。

一、比對新版本與老版本之間的差異,最好只下載差異的部分

思路很簡單,也非常清晰,那我們就照着這個目標行進。apk本身其實是一個zip壓縮包,你改下后綴名,再雙擊解壓就能得到apk內部的編譯打包后的文件,圖片音頻等文件是直接可以可讀的,其他的就得通過反編譯工具去查看了。所以我們應用的安裝文件apk就是一個二進制文件,如何得到兩個二進制文件的差異文件---差異包呢?好消息是已經有前人實現了,它的名字bsdiff,一個差異包比較工具,全稱是binary diff,二進制差異的意思。通過bsdiff,我們就能得到兩個apk的差異包了,下面我會把整理的命令文件打包到代碼中上傳Github上供大家使用的。bsdiff為我們提供的僅是一組用C實現的代碼,需要自己去編譯構建,我已經為大家准備了windows、OSX、Linux不同平台下使用的命令。

由於我的電腦是macbook,執行命令如下

執行命令之后,得到xx.patch,我們下面要下載的就是這個差異包。根據不同版本之間的差異,相對整個apk來說,差異包的體積會小很多。同時如果你的應用老版本有多個的話,你就需要生成對應的多個差異包。如果要想生成的流程自動化的話,找后台的哥們配合下就能輕松解決。

二、手機本地下載差異包,再和舊版本apk進行合並,最后合並成新版本apk。

根據當前版本號,向服務器發起請求,就得下載到對應的差異包。下面就是舊版本apk和patch合並的一步了,由於java本身並沒有提供相應的api,我們需要C去幫助實現,然后生成.so包進行調用。相對於生成差異包的bsdiff,也給提供了另一個bspatch,這個就是幫助我們進行文件和平的。如果要在Android中實現這一步,就需要去配置NDK的開發環境了,如果不想的同學可以直接把demo里面的.so文件拿出來用。調用下面的這個方法就可以實現文件的合並

合並出的apk文件,與最新的安裝包並無區別,具有同樣的特征值。最后通過Intent進行安裝。

寫在最后:有可能有的用戶所使用的版本比較老,與最新的apk相差很大的話,還是建議根據生成差異包的大小進行判定是否去直接下載apk進行更新。同時根據不同版本對應不一樣的差異包,和后端的小伙伴合作去自動化生成的話,大大減少了生成差異包時間上的浪費。最后如果只是修復關鍵性bug或者幾個新需求的添加,產生的差異包會很小,也會大大的減少了用戶的下載時間和流量消耗。

源碼地址:https://github.com/JackCho/AndroidPatchUpdate

 

如果覺得對你有所幫助,歡迎大家訂閱我的微信公眾賬號——Android干貨分享(ID:android_share)。下面是微信的二維碼,為你提供及時高質的Android干貨。技術交流QQ群:318588906,歡迎大家加群,共同探討下Android和Java技術,一起壯大我們的微信干貨分享社區。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM