?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ???android熱修復方案
一玩敏、概述
熱修復就是可以即時修復已經上線的應用程序的bug鸭叙,省去重新打包,測試能犯,升級版然后發(fā)布這么麻煩鲫骗。正常的修復bug流程為
使用熱修復
可見使用熱修復大大縮短了修復時間犬耻,讓用戶得到更好的體驗。
本在講述熱修復之前挎峦,我們先來說幾個關于熱修復的基礎知識點香追,各個修復框架大都利用這些原理合瓢。
1坦胶、DEX分包。
????????我們知道Android應用是運行在Dalvik VM上的晴楔,DVM只執(zhí)行.dex的文件顿苇。但是一個DEX文件最多支持65536個方法,而且Android2.3及以前版本用來執(zhí)行dexopt(用于優(yōu)化dex文件)的內存只分配了5M税弃,后來雖然對于內存有增加到8M/16M纪岁,但是超過65536方法數后依然會造成崩潰。所以引入了DEX分包(當方法數過多時就會產生多個.dex文件)则果。
2幔翰、CLASSLOADER。先上一張圖以及部分核心代碼西壮。
是不是很清晰遗增,Android使用PathClassLoader作為其類加載器,只能運行已經安裝的應用程序款青。DexClassLoader可以從.jar和.apk類型的文件內部加載classes.dex文件也可以用來執(zhí)行非安裝的程序代碼做修。以下為其源碼
二、比較熱門的熱修復技術
1抡草、QQ空間補丁
QQ空間補丁實現原理
上面我們提到DexClassLoader可以加載SD卡中的程序饰及,DexClassLoader繼承BaseDexClassLoader,BaseDexClassLoader中有個pathList對象康震,pathList中包含一個DexFile的數組dexElements燎含。在類加載時會遍歷Elements中的dex文件,直到找到class后返回腿短。假如我們的Classes2.dex中的Test.class存在bug屏箍,那么QQ空間補丁利用DexClassLoader把修復的Patch.dex放到Elements最前面,這樣虛擬機加載時就會直接拿到修復好的Pahtch.dex中的Test.class然后返回答姥。這樣就達到了熱修復的目的铣除。
QQ空間補丁實現流程圖
2、微信Tinker
???????微信針對QQ空間超級補丁技術的不足提出了一個提供DEX差量包鹦付,整體替換DEX的方案尚粘。也就是不像QQ空間提供一個Patch.dex,而是與應用程序的.dex進行比對敲长,替換掉其中不一樣的class文件郎嫁,達到修復的目的秉继。
3、阿里百川HotFix
? ? ? ? 與QQ空間超級補丁技術和微信Tinker相比泽铛,HotFix更適用于緊急修復線上bug尚辑,下拉補丁然后立即生效。
? ? ? ? AndFix實現是基于底層修改file的指針實現的盔腔,即修改指向bug類的指針指向我們修復好的類杠茬。
因為是native替換方法指針,所以有AndFix有兩點不足:
(1)弛随、不支持新增字段瓢喉,以及修改方法,也不支持對資源的替換
(2)舀透、由于廠商的自定義ROM栓票,對少數機型暫不支持。
上述三種熱修復方案對比如下
QQ空間補丁技術和微信Tinker是基于類加載技術愕够,支持資源以及SO包修復走贪,但對應用的性能和穩(wěn)定會有的一定的影響。增加了.dex文件會影響應用的性能惑芭,加長應用啟動時間坠狡。而HotFix不支持資源,SO包修復强衡。
4擦秽、Sophix
Sophix對其前輩Andfix,阿里百川Hotfix等方案進行了升級改造漩勤,打破了舊方案諸多限制感挥,涵蓋了代碼修復,資源修復越败,So庫修復触幼。Sophix是從兩種熱修復方案中演進,包含了上面所講述的兩種修復方案
(1)究飞、底層替換方案
底層替換的方案的優(yōu)點是置谦,在類加載后,動態(tài)修改native指針亿傅,修復即時生效媒峡,無需冷啟動。但缺點就是葵擎,正因為類已經被加載谅阿,內存中方法描述符(結構體)已經固定,所以只能替換,不能做新增修復签餐。
(2)寓涨、類加載方案
Sophix采用底層替換方案為主,類加載方案為次的模式氯檐,將二者結合起來戒良。Sophix使用類加載作為兜底方案。在熱部署無法使用的情況下冠摄,自動降級為冷部署方案糯崎。
未來會結合一些源代碼來詳細講述上述兩種修復方案,以及基于著兩種修復方案的各個修復框架耗拓。