Android的熱修復和AndFix方案

1.類加載方案
加載class會使用BaseDexClassLoader,在加載時,會遍歷文件下的element,並從element中獲取dex文件
方案 ,class文件在dex裏面 , 找到dex的方法是遍歷數組 , 那麼熱修復的原理, 就是將改好bug的dex文件放進集合的頭部, 這樣遍歷時會首先遍歷修復好的dex並找到修復好的類 . 這樣 , 我們就能在沒有發佈新版本的情況下 , 修改現有的bug。雖然我們無法改變現有的dex文件,但是遍歷的順序是從前往後的,在舊dex中的目標class是沒有機會上場的。

定位一下bug是出現在BugTest 中 , 所以我們首先修復bug

然後將class文件打包成dex文件
首先點擊Build->Rebuild Project 來重新構建, 構建完成之後, 可以在app / build / interintermediate / debug / 包名/ 找到你剛剛修改的class文件 , 將他拷貝出來
接下來就要生成dex文件了
要將class文件打包成dex文件,就需要用到dx指令,這個dx指令類似於java指令。dx指令也需要有程序來提供,它就在Android SDK的build-tools目錄下各個Android版本目錄之中。

接下來將dex文件拷貝到sd卡下面 , 當然如果是真實項目去下載的話 , 當然是要下載到特定目錄了

類加載由ClassLoader的實現類完成。玩過反編譯的都知道,我們在解壓了apk之後,最終會需要dex格式的文件來搞事,這個dex由class文件打包而成。那麼安卓中,要加載dex文件中的class文件,需要用到DexClassLoader或者PathClassLoader
PathClassLoader 可以加載Android系統中的dex文件
DexClassLoader 可以加載任意目錄的dex/zip/apk/jar文件 , 但是要指定optimizedDirectory.
這兩個類加載器都繼承BaseDexClassLoader,

在BaseDexClassLoader中 , 緊接着構造函數的是一個叫findClass的方法 , 這個方法用來加載dex文件中對應的class文件.

2.底層替換方案

與類加載方案不同的是,底層替換方案不會再次加載新類,而是直接在Native層修改原有類,由於是在原有類進行修改限制會比較多,不能夠增減原有類的方法和字段,如果我們增加了方法數,那麼方法索引數也會增加,這樣訪問方法時會無法通過索引找到正確的方法,同樣的字段也是類似的情況。
底層替換方案和反射的原理有些關聯,就拿方法替換來說,方法反射我們可以調用java.lang.Class.getDeclaredMethod
以阿里的那框架來說就是註解,然後尋找和替換
3 Instant Run方案
沒用過熱修復,蘋果也禁止熱修復,我同樣也不認爲這是一門安全的技術

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章