一. AndFix
AndFix的原理就是方法的替換,把有bug的方法替換成補(bǔ)丁文件中的方法椿浓。
注:在Native層使用指針替換的方式替換bug方法,已達(dá)到修復(fù)bug的目的。
AndFix采用native hook的方式挠进,這套方案直接使用dalvik_replaceMethod替換class中方法的實(shí)現(xiàn)色乾。由于它并沒(méi)有整體替換class, 而field在class中的相對(duì)地址在class加載時(shí)已確定,所以AndFix無(wú)法支持新增或者刪除filed的情況(通過(guò)替換init與clinit只可以修改field的數(shù)值)领突。Andfix可以支持的補(bǔ)丁場(chǎng)景相對(duì)有限暖璧,僅僅可以使用它來(lái)修復(fù)特定問(wèn)題。
二. QZone(插樁方式)
該方案基于的是android dex分包方案的, 簡(jiǎn)單的概括一下攘须,就是把多個(gè)dex文件塞入到app的classloader之中漆撞,但是android dex拆包方案中的類是沒(méi)有重復(fù)的,如果classes.dex和classes1.dex中有重復(fù)的類于宙,當(dāng)用到這個(gè)重復(fù)的類的時(shí)候浮驳,系統(tǒng)會(huì)選擇哪個(gè)類進(jìn)行加載呢? 讓我們來(lái)看看類加載的代碼:
一個(gè)ClassLoader可以包含多個(gè)dex文件捞魁,每個(gè)dex文件是一個(gè)Element至会,多個(gè)dex文件排列成一個(gè)有序的數(shù)組dexElements,當(dāng)找類的時(shí)候谱俭,會(huì)按順序遍歷dex文件奉件,然后從當(dāng)前遍歷的dex文件中找類,如果找類則返回昆著,如果找不到從下一個(gè)dex文件繼續(xù)查找县貌。
理論上,如果在不同的dex中有相同的類存在凑懂,那么會(huì)優(yōu)先選擇排在前面的dex文件的類煤痕,如下圖:
三. 微信Tinker(差量包)
Instant Run的冷插拔與buck的exopackage或許能給我們靈感脓豪,它們的思想都是全量替換新的Dex巷帝。
我們可以將新舊兩個(gè)Dex的差異放到補(bǔ)丁包中,最簡(jiǎn)單我們可以采用BsDiff算法扫夜。
簡(jiǎn)單來(lái)說(shuō)楞泼,在編譯時(shí)通過(guò)新舊兩個(gè)Dex生成差異path.dex。在運(yùn)行時(shí)笤闯,將差異patch.dex重新跟原始安裝包的舊Dex還原為新的Dex现拒。這個(gè)過(guò)程可能比較耗費(fèi)時(shí)間與內(nèi)存,所以我們是單獨(dú)放在一個(gè)后臺(tái)進(jìn)程:patch中望侈。為了補(bǔ)丁包盡量的小印蔬,微信自研了DexDiff算法,它深度利用Dex的格式來(lái)減少差異的大小脱衙。
四侥猬、阿里Sophix
原理(雙劍合璧):
1.優(yōu)化Andfix(突破底層結(jié)構(gòu)差異例驹,解決穩(wěn)定性問(wèn)題):
Andfix底層ArtMethod結(jié)構(gòu)時(shí)采用內(nèi)部變量一一替換,倒是這個(gè)各個(gè)廠商是會(huì)修改的退唠,所以兼容性不好鹃锈。
Sophix改變了一下思路,采用整體替換方法結(jié)構(gòu)瞧预,忽略底層實(shí)現(xiàn)屎债,從而解決兼容穩(wěn)定性問(wèn)題。
2.突破QQ和Tinker的缺陷
QQ和Tinker的缺陷
Sophix對(duì)dex的解決方案
- Dalvik下采用阿里自研的全量dex方案:不是考慮把補(bǔ)丁包的dex插到所有dex前面(dex插樁)垢油,而是想辦法在原理的dex中刪除(只是刪除了類的定義)補(bǔ)丁dex中存在的類盆驹,這樣讓系統(tǒng)查找類的時(shí)候在原來(lái)的dex中找不到,那么只有補(bǔ)丁中的dex加載到系統(tǒng)中滩愁,系統(tǒng)自然就會(huì)從補(bǔ)丁包中找到對(duì)應(yīng)的類躯喇。
- Art下本質(zhì)上虛擬機(jī)以及支持多dex的加載,Sophix的做法僅僅是把補(bǔ)丁dex作為主dex(classes.dex)而已硝枉,相當(dāng)于重新組織了所有的dex文件:把補(bǔ)丁包的dex改名為classes.dex廉丽,以前apk的所有dex依次改為classes2.dex、classes3.dex ... classesx.dex妻味,如下圖所示正压。
3.資源修復(fù)另辟蹊徑
常用方案(Instant Run技術(shù)):這種方案的兼容問(wèn)題在于替換AssetManager的地方
Sophix資源修復(fù)方案