2018-01-03

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ???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í)行非安裝的程序代碼做修。以下為其源碼

PathClassLoader.java

DexClassLoader.java

BaseDexClassLoader.java

DexPathList.java

二、比較熱門的熱修復技術

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使用類加載作為兜底方案。在熱部署無法使用的情況下冠摄,自動降級為冷部署方案糯崎。

未來會結合一些源代碼來詳細講述上述兩種修復方案,以及基于著兩種修復方案的各個修復框架耗拓。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末拇颅,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子乔询,更是在濱河造成了極大的恐慌,老刑警劉巖韵洋,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竿刁,死亡現場離奇詭異,居然都是意外死亡搪缨,警方通過查閱死者的電腦和手機食拜,發(fā)現死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來副编,“玉大人负甸,你說我怎么就攤上這事”越欤” “怎么了呻待?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長队腐。 經常有香客問我蚕捉,道長,這世上最難降的妖魔是什么柴淘? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任迫淹,我火速辦了婚禮,結果婚禮上为严,老公的妹妹穿的比我還像新娘敛熬。我一直安慰自己,他們只是感情好第股,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布应民。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瑞妇。 梳的紋絲不亂的頭發(fā)上稿静,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音辕狰,去河邊找鬼改备。 笑死,一個胖子當著我的面吹牛蔓倍,可吹牛的內容都是我干的悬钳。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼偶翅,長吁一口氣:“原來是場噩夢啊……” “哼默勾!你這毒婦竟也來了?” 一聲冷哼從身側響起聚谁,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤母剥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后形导,有當地人在樹林里發(fā)現了一具尸體环疼,經...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年朵耕,在試婚紗的時候發(fā)現自己被綠了炫隶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡阎曹,死狀恐怖伪阶,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情处嫌,我是刑警寧澤栅贴,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站锰霜,受9級特大地震影響筹误,放射性物質發(fā)生泄漏。R本人自食惡果不足惜癣缅,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一厨剪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧友存,春花似錦祷膳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春勇皇,著一層夾襖步出監(jiān)牢的瞬間罩句,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工敛摘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留门烂,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓兄淫,卻偏偏與公主長得像屯远,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子捕虽,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內容