[Android]AndFix的使用詳解

很久以前就有想了解熱修復(fù)的問題,但是很多情況下都缺乏實(shí)踐,網(wǎng)上看了很多hook的理論和實(shí)踐,近來研究了一番發(fā)現(xiàn)現(xiàn)在比較多使用的是阿里的AndFix,他能兼容android2.3~6.0的熱修復(fù),而且修復(fù)速度非???,補(bǔ)丁也非常小,用于修復(fù)緊急性bug是非常有效的。

AndFix最重要是運(yùn)用到(方法的替換),有些熱修復(fù)框架是將類替換,有些則替換dex


github地址

1.實(shí)現(xiàn)的方法替換



2.實(shí)例演示

當(dāng)我們下載了github的demo之后,可以看到demo仲提供了源碼和example

(1)import exmple的工程

(2)加入AndFix的庫

(3)然后我們需要修改MainActivity,添加一個TextView顯示

(4)然后要生成簽名打包一個apk,然后打包改名為1.apk

(5)修改TextView的文本

(6)編譯打包成新的apk,改名為2.apk

(7)demo里面tools的文件夾里面,有apkpatch的工具

需要使用它做一個補(bǔ)丁包


舊的apk為1.apk,新的apk為2.apk, -o表示補(bǔ)丁的輸出目錄,-k表示keystore, -p表示keystore的密碼,-a表示alias, -e表示entry password

然后會成一個.apatch的補(bǔ)丁包

(8)將.apatch的補(bǔ)丁包改名為out.apatch,然后放到手機(jī)的主目錄。

查看一下MainApplication


可以看到MainApplication啟動的時候會加載PatchManager,然后他會默認(rèn)加載一個out.apatch的補(bǔ)丁文件。

(9)再次進(jìn)入app就會發(fā)現(xiàn)textview會顯示bug fix證明更新是成功的

3.補(bǔ)丁命名的規(guī)則

a_b.apatch

a表示versionCode,b表示當(dāng)前的補(bǔ)丁的版本。

例如:如果當(dāng)前的versionCode的版本為4,補(bǔ)丁的版本為3,則命名為4_3.apatch。

4.適用性

Andfix并不能修復(fù)所有情況下出現(xiàn)的bug,測試結(jié)果如下:

其中對類得構(gòu)造方法和Application的onCreate方法,還有的xml綁定方法是不支持的

5.補(bǔ)丁加載的時機(jī)

一般情況下是越早加載越好,一般在MainApplication啟動的onCreate方法啟動補(bǔ)丁下載,然后調(diào)用pathManager的loadPatch方法

1.可以考慮下下載補(bǔ)丁,再下一次啟動后加載

2.或者下載補(bǔ)丁,立刻加載,然后會重啟app


6.補(bǔ)丁替換內(nèi)部流程


1.補(bǔ)丁下載到相應(yīng)目錄

2.通過loadPatch方法加載

3.會將補(bǔ)丁復(fù)制到app的目錄里面,然后下載補(bǔ)丁的文件會被刪除

4.如果versionName改變了,將會刪除apatch里面所有的補(bǔ)丁。


7.混淆

-printmapping proguard.map

首先需要生成mapping文件記錄混淆規(guī)則,之后可以把printmapping 這句話注釋掉,每次只使用applymapping。

-applymapping proguard.map

然后在下面加上

-keepclass*extendsjava.lang.annotation.Annotation

-keepclasseswithmembernamesclass*{native ;}

-keepclasscom.alipay.euler.andfix.**{ *; }


8.局限性

1.無法添加新類和新字段

2.無法替換構(gòu)造函數(shù)和Application的onCreate方法

3.未測試MVVM綁定和注解方法是否可以實(shí)現(xiàn)替換。

4.無法動態(tài)加入新功能模塊,有別于dex的替換


參考資料

AndFix使用說明

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容