標籤:raw 修複 oid github 順序 lob ace 產生 數值
一. AndFix
AndFix的原理就是方法的替換,把有bug的方法替換成補丁檔案中的方法。
註:在Native層使用指標替換的方式替換bug方法,已達到修複bug的目的。
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檔案的類,如:
在此基礎上,我們構想了熱補丁的方案,把有問題的類打包到一個dex(patch.dex)中去,然後把這個dex插入到Elements的最前面,如:
三. Tinker
Instant Run的冷插拔與buck的exopackage或許能給我們靈感,它們的思想都是全量替換新的Dex。
我們可以將新舊兩個Dex的差異放到補丁包中,最簡單我們可以採用BsDiff演算法。
簡單來說,在編譯時間通過新舊兩個Dex產生差異path.dex。在運行時,將差異patch.dex重新跟原始安裝包的舊Dex還原為新的Dex。這個過程可能比較耗費時間與記憶體,所以我們是單獨放在一個後台進程:patch中。為了補丁包盡量的小,自研了DexDiff演算法,它深度利用Dex的格式來減少差異的大小。
參考:https://github.com/WeMobileDev/article/blob/master/%E5%BE%AE%E4%BF%A1Android%E7%83%AD%E8%A1%A5%E4%B8%81%E5%AE%9E%E8%B7%B5%E6%BC%94%E8%BF%9B%E4%B9%8B%E8%B7%AF.md
Android主要熱更新技術原理