熱修復之AndFix探祕
近幾年熱修復技術可謂百花齊放,阿里的底層結構替換即時生效技術AndFix,後來又出來看起來很叼的Sophix,同時支持即時生效和冷啓動修復。微信的Tinker和餓了麼的Amigo。看了好幾遍AndFix原理後,特寫個Demo測試完成,寫個博客記錄下。
來張官網的原理圖
首先模擬一個類中出現了BUG方法。
然後在佈局文件點擊事件中調用這個方法,程序不出意外的奔潰退出了。
然後我們在項目中引用andfix.so庫
把AndFix類也加進來,因爲最終通過這個類去調用so的修復方法。
增加一個註解類,用於標識要替換的類和方法。
現在在fixBug上面註解表示我要替換剛纔那個有bug的方法。
這是AndFix調用修復的方法,只要我們把要有BUG的方法和修復好的BUG方法對象傳進去就可以
現在的問題是修復好的方法怎麼加載進來呢?
1 通過DexClassLoader類加載器加載
DexClassLoader使用說明可參考https://blog.csdn.net/u011068702/article/details/53263442
2 通過DexFile類加載,DexFile加載使用比DexClassLoader要簡單的多。本例子採用這種方法
通過DexClassLoader和BaseDexClassLoader的源碼查看發現,DexClassLoader其實也是採用DexFile類的加載方法去加載的。而DexFile的加載方法是一個native方法。
由於android虛擬機不能直接加載java直接生成的class文件,所以藉助dx工具把生成的class文件轉換爲dex文件
dx工具在相應的編譯工具下,如下圖所示我的dx工具目錄
dx命令
dx --dex --output=classes2.dex com\example\hellojnicallback\JniHandler.class
要把JniHandler的包路徑都複製過來,然後執行命令,執行成功後可以看到classes2.dex文件生成,把這個文件放到手機的sd卡上
然後加載,加載完後調用AndFix的替換方法,代碼如下
在調用替換方法前記得調用AndFix的初始化方法
點擊另一個按鈕執行fixBug方法
輸出如下
再點擊按鈕執行有bug的方法,
輸出如下,沒有崩潰了。證明方法已經替換成功了。
demo地址:https://github.com/helloworld777/hello-jni
AndFix github:https://github.com/alibaba/AndFix