一. AndFix
為茂南等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及茂南網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、網(wǎng)站制作、茂南網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
AndFix的原理就是方法的替換,把有bug的方法替換成補丁文件中的方法。
注:在Native層使用指針替換的方式替換bug方法,已達到修復(fù)bug的目的。
AndFix采用native hook的方式,這套方案直接使用dalvik_replaceMethod替換class中方法的實現(xiàn)。由于它并沒有整體替換class, 而field在class中的相對地址在class加載時已確定,所以AndFix無法支持新增或者刪除filed的情況(通過替換init與clinit只可以修改field的數(shù)值)。Andfix可以支持的補丁場景相對有限,僅僅可以使用它來修復(fù)特定問題。
二. QZone(插樁方式)
該方案基于的是android dex分包方案的, 簡單的概括一下,就是把多個dex文件塞入到app的classloader之中,但是android dex拆包方案中的類是沒有重復(fù)的,如果classes.dex和classes1.dex中有重復(fù)的類,當用到這個重復(fù)的類的時候,系統(tǒng)會選擇哪個類進行加載呢? ?讓我們來看看類加載的代碼:
一個ClassLoader可以包含多個dex文件,每個dex文件是一個Element,多個dex文件排列成一個有序的數(shù)組dexElements,當找類的時候,會按順序遍歷dex文件,然后從當前遍歷的dex文件中找類,如果找類則返回,如果找不到從下一個dex文件繼續(xù)查找。
理論上,如果在不同的dex中有相同的類存在,那么會優(yōu)先選擇排在前面的dex文件的類,如下圖:
在此基礎(chǔ)上,我們構(gòu)想了熱補丁的方案,把有問題的類打包到一個dex(patch.dex)中去,然后把這個dex插入到Elements的最前面,如下圖:
三. 微信Tinker(差量包)
Instant Run的冷插拔與buck的exopackage或許能給我們靈感,它們的思想都是全量替換新的Dex。
我們可以將新舊兩個Dex的差異放到補丁包中,最簡單我們可以采用BsDiff算法。
簡單來說,在編譯時通過新舊兩個Dex生成差異path.dex。在運行時,將差異patch.dex重新跟原始安裝包的舊Dex還原為新的Dex。這個過程可能比較耗費時間與內(nèi)存,所以我們是單獨放在一個后臺進程:patch中。為了補丁包盡量的小,微信自研了DexDiff算法,它深度利用Dex的格式來減少差異的大小。
四、阿里Sophix
Andfix底層ArtMethod結(jié)構(gòu)時采用內(nèi)部變量一一替換,倒是這個各個廠商是會修改的,所以兼容性不好。
Sophix改變了一下思路,采用整體替換方法結(jié)構(gòu),忽略底層實現(xiàn),從而解決兼容穩(wěn)定性問題。
QQ和Tinker的缺陷
Sophix對dex的解決方案
常用方案(Instant Run技術(shù)):這種方案的兼容問題在于替換AssetManager的地方
Sophix資源修復(fù)方案