熱修復之AndFix探祕

熱修復之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要簡單的多。本例子採用這種方法

 

通過DexClassLoaderBaseDexClassLoader的源碼查看發現,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

 

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