標籤:mil icp 安裝檔案 int 尾碼名 windows系統 壓縮包 oschina static
上一周比較忙,忙的不可開交,寫的文章也就兩篇,在此希望大家見諒。這周呢,突然閑下來了,有時間了,就重構了下代碼,搗鼓點前衛的技術,沉澱沉澱。所以呢。今天就分享下這幾天研究的東西。
移動互連網主打的就是使用者體驗和產品的高速迭代,通過使用者反饋和使用者行為跟蹤及時調整產品方向,這樣才幹持續保持生命力和創造力。說的接地氣點就是,你頻繁的升級更新。有時僅僅是修複了幾個bug或者微調了下介面,就讓使用者下載10幾兆甚至更大的apk,並且在眼下國內這個4G還不是普及的時候。對使用者來說是非常不友好的。
有沒有這樣一種策略呢,就如windows系統上打補丁一樣。通過體積比較小的補丁來完好系統存在的bug或者新功能的實現,假設能夠實現的話。使用者就再不會苦著臉去更新app了。答案是肯定的。要實現這個功能。須要下面兩個步驟。
一、比對新版本號碼與老版本號碼之間的差異,最好僅僅下載差異的部分
思路非常easy。也非常清晰,那我們就照著這個目標行進。apk本身事實上是一個zip壓縮包,你改下尾碼名,再雙擊解壓就能得到apk內部的編譯打包後的檔案,圖片音頻等檔案是直接能夠可讀的,其它的就得通過反編譯工具去查看了。所以我們應用的安裝檔案apk就是一個二進位檔案。怎樣得到兩個二進位檔案的差異檔案---差異包呢?好訊息是已經有前人實現了。它的名字bsdiff,一個差異包比較工具,全稱是binary diff,二進位差異的意思。通過bsdiff。我們就能得到兩個apk的差異包了,以下我會把整理的命令檔案打包到代碼中上傳Github上供大家使用的。bsdiff為我們提供的僅是一組用C實現的代碼,須要自己去編譯構建,我已經為大家準備了windows、OSX、Linux不同平台下使用的命令。
因為我的電腦是macbook。運行命令例如以下
運行命令之後。得到xx.patch,我們以下要下載的就是這個差異包。依據不同版本號碼之間的差異。相對整個apk來說,差異包的體積會小非常多。同一時候假設你的應用老版本號碼有多個的話,你就須要產生相應的多個差異包。
假設要想產生的流程自己主動化的話。找背景哥們配合下就能輕鬆解決。
二、手機本地下載差異包,再和舊版本號碼apk進行合并。最後合并成新版本號碼apk。
依據目前的版本號號,向server發起請求,就得下載到相應的差異包。以下就是舊版本號碼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技術,一起壯大我們的乾貨分享社區。
Android App補丁更新