很久以前就有想了解熱修復(fù)的問題蜂莉,但是很多情況下都缺乏實踐,網(wǎng)上看了很多hook的理論和實踐混卵,近來研究了一番發(fā)現(xiàn)現(xiàn)在比較多使用的是阿里的AndFix映穗,他能兼容android2.3~6.0的熱修復(fù),而且修復(fù)速度非衬凰妫快蚁滋,補(bǔ)丁也非常小,用于修復(fù)緊急性bug是非常有效的赘淮。
AndFix最重要是運(yùn)用到(方法的替換)辕录,有些熱修復(fù)框架是將類替換,有些則替換dex
1.實現(xiàn)的方法替換
2.實例演示
當(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綁定和注解方法是否可以實現(xiàn)替換。
4.無法動態(tài)加入新功能模塊潦蝇,有別于dex的替換
參考資料