一. AndFix
AndFix的原理就是方法的替換,把有bug的方法替換成補(bǔ)丁文件中的方法。
注:在Native層使用指針替換的方式替換bug方法,已達(dá)到修復(fù)bug的目的。
AndFix采用native hook的方式,這套方案直接使用dalvik_replaceMethod替換class中方法的實(shí)現(xiàn)。由于它并沒有整體替換class, 而field在class中的相對地址在class加載時(shí)已確定,所以AndFix無法支持新增或者刪除filed的情況(通過替換init與clinit只可以修改field的數(shù)值)。Andfix可以支持的補(bǔ)丁場景相對有限,僅僅可以使用它來修復(fù)特定問題。
二. QZone(插樁方式)
該方案基于的是android dex分包方案的, 簡單的概括一下,就是把多個(gè)dex文件塞入到app的classloader之中,但是android dex拆包方案中的類是沒有重復(fù)的,如果classes.dex和classes1.dex中有重復(fù)的類,當(dāng)用到這個(gè)重復(fù)的類的時(shí)候,系統(tǒng)會(huì)選擇哪個(gè)類進(jìn)行加載呢? ?讓我們來看看類加載的代碼:
一個(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文件的類,如下圖:
在此基礎(chǔ)上,我們構(gòu)想了熱補(bǔ)丁的方案,把有問題的類打包到一個(gè)dex(patch.dex)中去,然后把這個(gè)dex插入到Elements的最前面,如下圖:
三. 微信Tinker(差量包)
Instant Run的冷插拔與buck的exopackage或許能給我們靈感,它們的思想都是全量替換新的Dex。
我們可以將新舊兩個(gè)Dex的差異放到補(bǔ)丁包中,最簡單我們可以采用BsDiff算法。
簡單來說,在編譯時(shí)通過新舊兩個(gè)Dex生成差異path.dex。在運(yùn)行時(shí),將差異patch.dex重新跟原始安裝包的舊Dex還原為新的Dex。這個(gè)過程可能比較耗費(fèi)時(shí)間與內(nèi)存,所以我們是單獨(dú)放在一個(gè)后臺進(jìn)程:patch中。為了補(bǔ)丁包盡量的小,微信自研了DexDiff算法,它深度利用Dex的格式來減少差異的大小。
四、阿里Sophix
Andfix底層ArtMethod結(jié)構(gòu)時(shí)采用內(nèi)部變量一一替換,倒是這個(gè)各個(gè)廠商是會(huì)修改的,所以兼容性不好。
Sophix改變了一下思路,采用整體替換方法結(jié)構(gòu),忽略底層實(shí)現(xiàn),從而解決兼容穩(wěn)定性問題。
QQ和Tinker的缺陷
Sophix對dex的解決方案
常用方案(Instant Run技術(shù)):這種方案的兼容問題在于替換AssetManager的地方
Sophix資源修復(fù)方案
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
名稱欄目:Android熱修復(fù)原理-創(chuàng)新互聯(lián)
轉(zhuǎn)載注明:http://www.chinadenli.net/article20/gsdco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊、微信小程序、面包屑導(dǎo)航、網(wǎng)頁設(shè)計(jì)公司、網(wǎng)站策劃、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容