最近在看熱修復相干的框架,之前我們已看過了阿里的Dexposed和AndFix這兩個框架了,不了解的同學可以點擊這里進行查看:Dexposed框架原理解析 和 AndFix熱修復框架原理解析,然后還有最近很火的1個是騰訊的Tinker熱修復框架,再看他的原理實現的時候,發現了他使用到了開源的文件差分工具bsdiff/bspatch,所以就單獨用這篇文章來詳細介紹1下這個工具,由于這個工具有1個很大的用處就是增量更新,也就是我們看到現在大部份的利用市場推出的省流量更新利用的效果:
看到了吧,會提示你省了很多流量,依照之前常規的思路就是有利用更新了,就直接把更新的apk包下載然后升級安裝,那末如果1個apk包很大,如果在非Wifi情況下還是很耗流量的,但是有時候我們會發現1個利用在升級的時候只是改了部份功能,有些功能并沒有改,那末就想了如果要是能直接更新變動的功能的話,那末就會下載數據非常少了。這就需要借助我們幾天介紹的這個文件差分工具bsdiff/bspatch了。
上面的省流量更新原理可以這么理解:服務端可以借助bsdiff工具,比對新舊apk包的文件,獲得到差分文件以后下發到客戶端,而這個差分文件的大小肯定是小于新的apk文件大小的。客戶端得到這個差分文件以后,本地在使用bspatch工具進行差分文件和本地已安裝的舊apk包進行合并成新的apk包文件,然后在進行升級安裝。
在這個進程中,客戶端在訪問服務真個時候可能需要攜帶舊apk包的md5,利用包名,版本號等信息,服務端獲得到以后會去數據庫中查詢其對應的本次需要升級的apk包和舊版本號對應的舊apk包,然落后行差分處理得到差分文件,在下發到客戶端便可。
上面了解了原理以后,下面就直接看通過源碼進行操作吧,前面已說過了,bsdiff和bspatch這個功能源碼是開源的,可以從網上查找,關于他們的源碼這里不做太多的介紹,由于是純C代碼,分析起來沒甚么意思,可以自行瀏覽便可,由于是純C語言的,所以如果我們想在Android端使用的話那末就需要使用NDK進行開發了,需要在上層用native方法進行關聯訪問,這個其實也沒甚么大的問題,而關于服務端那邊進行文件差分操作,這個已有現成的工具了,也是用C語言編譯的可履行文件。所以下面第1步先來解決客戶真個NDK開發工作:
第1步:定義native方法
這個native方法還是比較簡單的,參數也很容易理解,新舊apk包路徑,差分包路徑。
第2步:使用javah生成頭文件
注意:這里的命令是運行在源碼src目錄下,采取的類全名方式生成的。會在當前目錄下生成對應的頭文件:
第3步:新建jni目錄
右擊項目,選擇Android Tools=》Add Native Support,點擊下1步便可,在項目中會生成1個jni目錄,然后我們把上面生成的頭文件拷貝到這里,同時把網上找到的bsdiff和bspatch源碼也拷貝到這個目錄下:
然后記得添加編譯腳本mk文件便可。
第4步:編寫native層代碼
這里代碼非常簡單,把上層傳遞的參數直接傳入到applypatch函數中便可,相當于我們甚么都不用做。
第5步:使用編譯以后的bsdiff工具生成差分文件patch
在這個目錄下運行命令:bsdiff.exe demo_old.apk demo_new.apk demo.patch;然后生成了demo.patch文件,我們可以將其拷貝到sdcard目錄下。
第6步:客戶端編寫代碼進行差分文件合并
這里通過sdcard目錄下的舊apk文件和生成的patch文件進行合并工作,生成新的apk文件,生成以后直接進行升級安裝。
注意:這里我們為了懶,把舊apk直接拷貝到sdcard目錄了,而在實際開發中我們應當通過系統提供的方法直接獲得已安裝利用的apk文件路徑的:
上面的代碼已編寫完成了,下面就直接運行便可,會自動編譯native的代碼:
然后運行結果:
這樣就簡單實現了利用的增量升級了。而這個技術在后面介紹Tinker框架的時候會觸及到,他內部做了差分文件也是借助這個工具來進行操作的。
項目下載地址:https://github.com/fourbrother/android_diffupdate
現在的熱修復框架都會觸及到修復文件,而這個文件現在都可能叫做差分文件。就是需要真正修復問題的文件包。這個技術在初期利用市場中的省流量升級已體現出來了。
更多內容:點擊這里
關注微信公眾號,最新技術干貨實時推送
上一篇 2017程序員面試簡歷注意事項
下一篇 樸素貝葉斯