一. AndFixhtml
AndFix的原理就是方法的替換,把有bug的方法替換成補丁文件中的方法。 android
AndFix採用native hook的方式,這套方案直接使用dalvik_replaceMethod替換class中方法的實現。因爲它並無總體替換class, 而field在class中的相對地址在class加載時已肯定,因此AndFix沒法支持新增或者刪除filed的狀況(經過替換init與clinit只能夠修改field的數值)。Andfix能夠支持的補丁場景相對有限,僅僅可使用它來修復特定問題。 二. QZone(插樁方式)算法
該方案基於的是android dex分包方案的, 簡單的歸納一下,就是把多個dex文件塞入到app的classloader之中,可是android dex拆包方案中的類是沒有重複的,若是classes.dex和classes1.dex中有重複的類,當用到這個重複的類的時候,系統會選擇哪一個類進行加載呢? 讓咱們來看看類加載的代碼:數組
一個ClassLoader能夠包含多個dex文件,每一個dex文件是一個Element,多個dex文件排列成一個有序的數組dexElements,當找類的時候,會按順序遍歷dex文件,而後從當前遍歷的dex文件中找類,若是找類則返回,若是找不到從下一個dex文件繼續查找。微信
理論上,若是在不一樣的dex中有相同的類存在,那麼會優先選擇排在前面的dex文件的類,以下圖:app
在此基礎上,咱們構想了熱補丁的方案,把有問題的類打包到一個dex(patch.dex)中去,而後把這個dex插入到Elements的最前面,以下圖:優化
三. 微信Tinker(差量包)ui
Instant Run的冷插拔與buck的exopackage或許能給咱們靈感,它們的思想都是全量替換新的Dex。3d
咱們能夠將新舊兩個Dex的差別放到補丁包中,最簡單咱們能夠採用BsDiff算法。指針
簡單來講,在編譯時經過新舊兩個Dex生成差別path.dex。在運行時,將差別patch.dex從新跟原始安裝包的舊Dex還原爲新的Dex。這個過程可能比較耗費時間與內存,因此咱們是單獨放在一個後臺進程:patch中。爲了補丁包儘可能的小,微信自研了DexDiff算法,它深度利用Dex的格式來減小差別的大小。 4、阿里Sophix
Andfix底層ArtMethod結構時採用內部變量一一替換,卻是這個各個廠商是會修改的,因此兼容性很差。
Sophix改變了一下思路,採用總體替換方法結構,忽略底層實現,從而解決兼容穩定性問題。
QQ和Tinker的缺陷
Sophix對dex的解決方案
經常使用方案(Instant Run技術):這種方案的兼容問題在於替換AssetManager的地方
Sophix資源修復方案