上一週比較忙,忙的不可開交,寫的文章也就兩篇,在此但願你們見諒。這周呢,忽然閒下來了,有時間了,就重構了下代碼,搗鼓點前衛的技術,沉澱沉澱。因此呢,今天就分享下這幾天研究的東西。java
移動互聯網主打的就是用戶體驗和產品的快速迭代,經過用戶反饋和用戶行爲跟蹤及時調整產品方向,這樣才能持續保持生命力和創造力。說的接地氣點就是,你頻繁的升級更新,有時只是修復了幾個bug或者微調了下界面,就讓用戶下載10幾兆甚至更大的apk,並且在目前國內這個4G還不是普及的時候,對用戶來講是很不友好的。有沒有這樣一種策略呢,就如windows系統上打補丁同樣,經過體積比較小的補丁來完善系統存在的bug或者新功能的實現,若是能夠實現的話,用戶就再不會苦着臉去更新app了。答案是確定的,要實現這個功能,須要如下兩個步驟。android
1、比對新版本與老版本之間的差別,最好只下載差別的部分git
思路很簡單,也很是清晰,那咱們就照着這個目標行進。apk自己實際上是一個zip壓縮包,你改下後綴名,再雙擊解壓就能獲得apk內部的編譯打包後的文件,圖片音頻等文件是直接能夠可讀的,其餘的就得經過反編譯工具去查看了。因此咱們應用的安裝文件apk就是一個二進制文件,如何獲得兩個二進制文件的差別文件---差別包呢?好消息是已經有前人實現了,它的名字bsdiff,一個差別包比較工具,全稱是binary diff,二進制差別的意思。經過bsdiff,咱們就能獲得兩個apk的差別包了,下面我會把整理的命令文件打包到代碼中上傳Github上供你們使用的。bsdiff爲咱們提供的僅是一組用C實現的代碼,須要本身去編譯構建,我已經爲你們準備了windows、OSX、Linux不一樣平臺下使用的命令。github
因爲個人電腦是macbook,執行命令以下windows
執行命令以後,獲得xx.patch,咱們下面要下載的就是這個差別包。根據不一樣版本之間的差別,相對整個apk來講,差別包的體積會小不少。同時若是你的應用老版本有多個的話,你就須要生成對應的多個差別包。若是要想生成的流程自動化的話,找後臺的哥們配合下就能輕鬆解決。後端
2、手機本地下載差別包,再和舊版本apk進行合併,最後合併成新版本apk。api
根據當前版本號,向服務器發起請求,就得下載到對應的差別包。下面就是舊版本apk和patch合併的一步了,因爲java自己並無提供相應的api,咱們須要C去幫助實現,而後生成.so包進行調用。相對於生成差別包的bsdiff,也給提供了另外一個bspatch,這個就是幫助咱們進行文件和平的。若是要在Android中實現這一步,就須要去配置NDK的開發環境了,若是不想的同窗能夠直接把demo裏面的.so文件拿出來用。調用下面的這個方法就能夠實現文件的合併服務器
合併出的apk文件,與最新的安裝包並沒有區別,具備一樣的特徵值。最後經過Intent進行安裝。微信
寫在最後:有可能有的用戶所使用的版本比較老,與最新的apk相差很大的話,仍是建議根據生成差別包的大小進行斷定是否去直接下載apk進行更新。同時根據不一樣版本對應不同的差別包,和後端的小夥伴合做去自動化生成的話,大大減小了生成差別包時間上的浪費。最後若是隻是修復關鍵性bug或者幾個新需求的添加,產生的差別包會很小,也會大大的減小了用戶的下載時間和流量消耗。app
源碼地址:https://github.com/JackCho/AndroidPatchUpdate
若是以爲對你有所幫助,歡迎你們訂閱個人微信公衆帳號——Android乾貨分享(ID:android_share)。下面是微信的二維碼,爲你提供及時高質的Android乾貨。技術交流QQ羣:318588906,歡迎你們加羣,共同探討下Android和Java技術,一塊兒壯大咱們的微信乾貨分享社區。