熱修復(fù)一:代碼修復(fù)

熱修復(fù)選型:

目前國(guó)內(nèi)主流的兩種熱修復(fù)策略有以下兩種:以阿里系為主的底層method修復(fù)方案(Hotfix);基于修改dex結(jié)構(gòu)的tx系類加載方案(Tinker)。-----阿里于17年推出的sophix方案其實(shí)是兩個(gè)方案的集合體。

局限性和優(yōu)劣性我借住以下圖標(biāo)來(lái)做個(gè)說(shuō)明:


tinker是我目前學(xué)習(xí)使用的主流框架,主要原因在于其穩(wěn)定性以及全面性,在實(shí)際開發(fā)中用于一些非緊急bug修復(fù),以及作為緊急bug修復(fù)發(fā)版的輔助項(xiàng)。

先來(lái)聊一聊andfix(MethodHotFix)的使用感受吧,不穩(wěn)定,不穩(wěn)定,不穩(wěn)定,重要的事情說(shuō)三遍!!!!!在任何一個(gè)生產(chǎn)項(xiàng)目中,穩(wěn)定性是衡量技術(shù)方案的最主要因素。

1:MethodHotFix基于規(guī)范的虛擬機(jī)底層,動(dòng)態(tài)修改和擴(kuò)展method,而國(guó)內(nèi)各大廠商又會(huì)對(duì)底層做一定的定制修改,這樣很容易導(dǎo)致失敗。

2:app運(yùn)行時(shí),類結(jié)構(gòu)已經(jīng)固化在內(nèi)存中,其動(dòng)態(tài)屬性很難擴(kuò)展;

3: ?底層替換方案是在已經(jīng)加載的類中,直接替換原有方法,在原有類上進(jìn)行修改。因而無(wú)法進(jìn)行字段和方法的增減。因?yàn)檫@樣會(huì)修改原有類的結(jié)構(gòu)。舉例:方法新增或者刪除,會(huì)導(dǎo)致這個(gè)類或者整個(gè)Dex方法數(shù)修改,方法數(shù)的修改會(huì)導(dǎo)致方法索引的修改,這樣在訪問(wèn)方法時(shí),就無(wú)法訪問(wèn)正確的索引了。字段的增減會(huì)導(dǎo)致字段索引變更,如果一個(gè)類新增了某個(gè)字段,由新方法訪問(wèn)已經(jīng)聲明的未修改前的實(shí)例對(duì)象,就難以預(yù)知會(huì)發(fā)生什么。。

底層替換方案主要是依賴修改虛擬機(jī)方法實(shí)體的具體字段。

如修改Dalvik方法的 jni 函數(shù)指針,改類或者方法的訪問(wèn)權(quán)限等。

art虛擬機(jī)中,每一個(gè)Java方法在art中都對(duì)應(yīng)著一個(gè)ArtMethod,ArtMethod記錄了這個(gè)Java方法的所有信息,包括所屬類、訪問(wèn)權(quán)限、代碼執(zhí)行地址等等。而andfix根據(jù)標(biāo)準(zhǔn)的ArtMethod進(jìn)行修改,然而各大廠商又可能修改了底層的ArtMethod,這樣通用的替換機(jī)制就會(huì)出現(xiàn)問(wèn)題。

數(shù)組優(yōu)化,不理解


類加載方案:代表作Tinker,冷啟動(dòng),需要重啟生效

類加載方案,是app在重啟后,讓classLoader去加載新類。在app運(yùn)行中,需要修改的類已經(jīng)加載過(guò)了,android是無(wú)法將一個(gè)類進(jìn)行卸載的。不重啟的話,原有的類還在虛擬機(jī)中,無(wú)法加載新類。

QQ空間方案需要侵入打包過(guò)程,為了支持hack會(huì)添加一些無(wú)用信息,不夠優(yōu)雅。QFix修復(fù)方案需要獲取底層虛擬機(jī)函數(shù),不夠穩(wěn)定可靠,且無(wú)法新增public函數(shù)。

Tinker是完整的全量替換dex方案,通過(guò)DexDiff算法的實(shí)現(xiàn),我們既解決了Dalvik平臺(tái)的性能損耗問(wèn)題,又解決了Art平臺(tái)補(bǔ)丁包過(guò)大的問(wèn)題。但這套方案的缺點(diǎn)在于占Rom體積比較大,微信考慮到移動(dòng)設(shè)備的存儲(chǔ)空間提升比較快,增加幾十M的Rom空間這個(gè)代價(jià)可以接受。

sophix,阿里最新的熱修復(fù)方案,在類加載實(shí)現(xiàn)中,也是采用dex全量替換的過(guò)程,但是顆粒主要是在類維度上。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,835評(píng)論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,676評(píng)論 3 419
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,730評(píng)論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,118評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,873評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,266評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,330評(píng)論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,482評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,036評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,846評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,025評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,575評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,279評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,684評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,953評(píng)論 1 289
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,751評(píng)論 3 394
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,016評(píng)論 2 375

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