Android 熱修復(fù) 技術(shù)淺析

一先朦、Android 中的兩大流派:

1次洼、Native Hook 流派:改寫(xiě) 方法:淘寶的Dexposed,支付寶的AndFix 、Rebust辛萍、instantRun ?

Dexposed只只吃Android 5.0之下悯姊,不支持全平臺(tái)。

2叹阔、dex hack 流派:QQ超級(jí)補(bǔ)丁挠轴,Tinker 。

二耳幢、方案分析

http://www.chinaz.com/news/2016/0912/579753.shtml

1、QQ空間超級(jí)補(bǔ)杜菲 :

(1)mutilDex機(jī)制睛藻。QQ空間超級(jí)補(bǔ)丁方案是基于android dex分包方案。

分包機(jī)制的來(lái)由(邢隧?)dexopt 店印、65K限制。

當(dāng)一個(gè)apk在安裝的時(shí)候倒慧,apk中的classes.dex會(huì)被虛擬機(jī)(dexopt)優(yōu)化成odex文件按摘,然后才會(huì)拿去執(zhí)行包券。

(2)ClassLoader 類(lèi)加載機(jī)制。ClassLoader機(jī)制是QQ空間超級(jí)補(bǔ)丁方案的基石炫贤。

tm一個(gè)ClassLoader可以包含多個(gè)dex文件溅固,每個(gè)dex文件就是一個(gè) Element,多個(gè)dex文件排列形成一個(gè)有序的數(shù)組DexElements,當(dāng)查找某個(gè)類(lèi)時(shí)會(huì)按照順序遍歷dex文件兰珍,然后從當(dāng)前遍歷的dex文件中找類(lèi)侍郭,如果找到了則返回,如果找不到則從下一個(gè)dex查找掠河。理論上亮元,如果在不同的dex中有相同的類(lèi)存在,那么優(yōu)先選擇排在前面的dex文件的類(lèi)唠摹。

當(dāng)patch.dex中包含Test.class時(shí)就會(huì)優(yōu)先加載爆捞,在后續(xù)的DEX中遇到Test.class的話(huà)就會(huì)直接返回而不去加載,這樣就達(dá)到了修復(fù)的目的勾拉。



(3)副作用:CLASS_ISPREVERIFIED 標(biāo)志煮甥。

防止類(lèi)被打上CLASS_ISPREVERIFIED標(biāo)志。

最終空間的方案是往所有類(lèi)的構(gòu)造函數(shù)里面插入了一段代碼望艺,如下:

if (ClassVerifier.PREVENT_VERIFY) {

System.out.println(AntilazyLoad.class);

}

這樣當(dāng)安裝apk的時(shí)候苛秕,classes.dex內(nèi)的類(lèi)都會(huì)引用一個(gè)在不相同dex中的AntilazyLoad類(lèi),這樣就防止了類(lèi)被打上CLASS_ISPREVERIFIED的標(biāo)志了找默,只要沒(méi)被打上這個(gè)標(biāo)志的類(lèi)都可以進(jìn)行打補(bǔ)丁操作艇劫。

優(yōu)勢(shì):

1.? 沒(méi)有合成整包(和微信Tinker比起來(lái)),產(chǎn)物比較小惩激,比較靈活

2.? 可以實(shí)現(xiàn)類(lèi)替換店煞,兼容性高。(某些三星手機(jī)不起作用)

不足:

1. 不支持即時(shí)生效风钻,必須通過(guò)重啟才能生效顷蟀。

2. 為了實(shí)現(xiàn)修復(fù)這個(gè)過(guò)程,必須在應(yīng)用中加入兩個(gè)dex!dalvikhack.dex中只有一個(gè)類(lèi)骡技,對(duì)性能影響不大鸣个,但是對(duì)于patch.dex來(lái)說(shuō),修復(fù)的類(lèi)到了一定數(shù)量布朦,就需要花不少的時(shí)間加載囤萤。對(duì)手淘這種航母級(jí)應(yīng)用來(lái)說(shuō),啟動(dòng)耗時(shí)增加2s以上是不能夠接受的事是趴。

3. 在ART模式下涛舍,如果類(lèi)修改了結(jié)構(gòu),就會(huì)出現(xiàn)內(nèi)存錯(cuò)亂的問(wèn)題唆途。為了解決這個(gè)問(wèn)題富雅,就必須把所有相關(guān)的調(diào)用類(lèi)掸驱、父類(lèi)子類(lèi)等等全部加載到patch.dex中,導(dǎo)致補(bǔ)丁包異常的大没佑,進(jìn)一步增加應(yīng)用啟動(dòng)加載的時(shí)候毕贼,耗時(shí)更加嚴(yán)重。

2图筹、微信 Tinker


在編譯時(shí)通過(guò)新舊兩個(gè)Dex生成差異path.dex帅刀。在運(yùn)行時(shí),將差異patch.dex重新跟原始安裝包的舊Dex還原為新的Dex远剩。這個(gè)過(guò)程可能比較耗費(fèi)時(shí)間與內(nèi)存扣溺,所以我們是單獨(dú)放在一個(gè)后臺(tái)進(jìn)程:patch中。




優(yōu)勢(shì):

1.? 合成整包瓜晤,不用在構(gòu)造函數(shù)插入代碼锥余,防止verify,verify和opt在編譯期間就已經(jīng)完成痢掠,不會(huì)在運(yùn)行期間進(jìn)行驱犹。

2.? 性能提高。兼容性和穩(wěn)定性比較高足画。

3.? 開(kāi)發(fā)者透明雄驹,不需要對(duì)包進(jìn)行額外處理。

不足:

1. 與超級(jí)補(bǔ)丁技術(shù)一樣淹辞,不支持即時(shí)生效医舆,必須通過(guò)重啟應(yīng)用的方式才能生效。

2. 需要給應(yīng)用開(kāi)啟新的進(jìn)程才能進(jìn)行合并象缀,并且很容易因?yàn)閮?nèi)存消耗等原因合并失敗蔬将。

3. 合并時(shí)占用額外磁盤(pán)空間(占用Rom體積),這邊大約是你修改Dex數(shù)量的1.5倍(dexopt與dex壓縮成jar)的大醒胄恰)霞怀。

微信的這套方案并非沒(méi)有優(yōu)缺點(diǎn),它帶來(lái)的問(wèn)題有兩個(gè):

占用Rom體積莉给;這邊大約是你修改Dex數(shù)量的1.5倍(dexopt與dex壓縮成jar)的大小毙石。

一個(gè)額外的合成過(guò)程;雖然我們單獨(dú)放在一個(gè)進(jìn)程上處理颓遏,但是合成時(shí)間的長(zhǎng)短與內(nèi)存消耗也會(huì)影響最終的成功率

四胁黑、AndFix:

AndFix 提供一種運(yùn)行時(shí)在Native修改Field指針的方式,實(shí)現(xiàn)方法的替換州泊,達(dá)到即時(shí)生效無(wú)需重啟,對(duì)應(yīng)用無(wú)性能損耗的目的漂洋。

1遥皂、原理如圖:

2力喷、實(shí)現(xiàn)過(guò)程:


優(yōu)勢(shì):

1.? BUG修復(fù)的即時(shí)性

2.? 補(bǔ)丁包同樣采用差量技術(shù),生成的PATCH體積小

3.? 對(duì)應(yīng)用無(wú)侵入演训,幾乎無(wú)性能損耗

不足:

1.? 不支持新增字段弟孟,以及修改方法,也不支持對(duì)資源的替換样悟。

2.? 由于廠商的自定義ROM拂募,對(duì)少數(shù)機(jī)型暫不支持。

Android 熱補(bǔ)丁展望:

2窟她、遠(yuǎn)端調(diào)試:如果 能夠?qū)崿F(xiàn)真對(duì)某個(gè)用戶(hù)下發(fā)陈症,就可以作為遠(yuǎn)端調(diào)試功能。

一入Android深似海情组,Android開(kāi)發(fā)的另外一個(gè)痛是機(jī)型的碎片化窃植。我們也許都會(huì)遇到”本地不復(fù)現(xiàn)”溉仑,”日志查不出”,”聯(lián)系用戶(hù)不鳥(niǎo)你”的煩惱论咏。所以補(bǔ)丁機(jī)制非常適合使用在遠(yuǎn)端調(diào)試上。即我們需要具備只特定用戶(hù)發(fā)送補(bǔ)丁的能力颁井,這對(duì)我們查找問(wèn)題非常有幫助厅贪。

3、數(shù)據(jù)統(tǒng)計(jì):

熱補(bǔ)丁無(wú)論在普通的數(shù)據(jù)統(tǒng)計(jì)還是ABTest都有著非常大的優(yōu)勢(shì)雅宾。例如若我想對(duì)同一批用戶(hù)做兩種test, 傳統(tǒng)方式無(wú)法讓這批用戶(hù)去安裝兩個(gè)版本养涮。使用補(bǔ)丁技術(shù),我們可以方便的對(duì)同一批用戶(hù)不停的更換補(bǔ)丁秀又。


http://blog.csdn.net/tencent_bugly/article/details/51821722

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末单寂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子吐辙,更是在濱河造成了極大的恐慌宣决,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,126評(píng)論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昏苏,死亡現(xiàn)場(chǎng)離奇詭異尊沸,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)贤惯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門(mén)洼专,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人孵构,你說(shuō)我怎么就攤上這事屁商。” “怎么了颈墅?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,941評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵蜡镶,是天一觀的道長(zhǎng)雾袱。 經(jīng)常有香客問(wèn)我,道長(zhǎng)官还,這世上最難降的妖魔是什么芹橡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,294評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮望伦,結(jié)果婚禮上林说,老公的妹妹穿的比我還像新娘。我一直安慰自己屯伞,他們只是感情好腿箩,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著愕掏,像睡著了一般度秘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饵撑,一...
    開(kāi)封第一講書(shū)人閱讀 52,874評(píng)論 1 314
  • 那天剑梳,我揣著相機(jī)與錄音,去河邊找鬼滑潘。 笑死垢乙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的语卤。 我是一名探鬼主播追逮,決...
    沈念sama閱讀 41,285評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼粹舵!你這毒婦竟也來(lái)了钮孵?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,249評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤眼滤,失蹤者是張志新(化名)和其女友劉穎巴席,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體诅需,經(jīng)...
    沈念sama閱讀 46,760評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漾唉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了堰塌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赵刑。...
    茶點(diǎn)故事閱讀 40,973評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖场刑,靈堂內(nèi)的尸體忽然破棺而出般此,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,631評(píng)論 5 351
  • 正文 年R本政府宣布恤煞,位于F島的核電站屎勘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏居扒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評(píng)論 3 336
  • 文/蒙蒙 一丑慎、第九天 我趴在偏房一處隱蔽的房頂上張望喜喂。 院中可真熱鬧,春花似錦竿裂、人聲如沸玉吁。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,797評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)进副。三九已至,卻和暖如春悔常,著一層夾襖步出監(jiān)牢的瞬間影斑,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,926評(píng)論 1 275
  • 我被黑心中介騙來(lái)泰國(guó)打工机打, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留矫户,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,431評(píng)論 3 379
  • 正文 我出身青樓残邀,卻偏偏與公主長(zhǎng)得像皆辽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子芥挣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容