Android熱修復(fù)【主流技術(shù)對比】

三分鐘的介紹

熱修復(fù)技術(shù)剥哑,可以看做是Android平臺發(fā)展成熟至一定階段的必然產(chǎn)物杯拐。熱修復(fù)無疑是這2年較火的新技術(shù)怪瓶,是作為安卓工程師必學(xué)的技能之一。在熱修復(fù)出現(xiàn)之前嚎幸,一個(gè)已經(jīng)上線的app中如果出現(xiàn)了bug颜矿,即使是一個(gè)非常小的bug,不及時(shí)更新的話有可能存在風(fēng)險(xiǎn)嫉晶,若要及時(shí)更新就得將app重新打包發(fā)布到應(yīng)用市場后或衡,讓用戶再一次下載,這樣就大大降低了用戶體驗(yàn)车遂,當(dāng)熱修復(fù)出現(xiàn)之后封断,這樣的問題就不再是問題了。

國內(nèi)大部分成熟的主流APP都擁有自己的熱更新技術(shù)舶担,像手淘坡疼、支付寶、微信衣陶、QQ柄瑰、餓了么、美團(tuán)等剪况。

先來看一下對比圖


熱修復(fù)對比

熱修復(fù)技術(shù)實(shí)現(xiàn)的原理(AndFix)

Andfix 是支付寶提出的一種底層結(jié)構(gòu)替換的方案教沾,也達(dá)到了運(yùn)行時(shí)即時(shí)生效的效果,并且重要的是译断,做到了Dalvik和ART環(huán)境的全版本兼容授翻。

AndFix

AndFix的原理就是方法的替換,把有bug的方法替換成補(bǔ)丁文件中的方法孙咪。在Native動(dòng)態(tài)替換Java層的方法堪唐,通過Native層hook Java層的代碼


AndFix使用

優(yōu)點(diǎn):
1.BUG修復(fù)的即時(shí)性
2.補(bǔ)丁包同樣采用差量技術(shù),生成的PATCH體積小
3.對應(yīng)用無侵入翎蹈,幾乎無性能損耗

不足:
1.不支持新增字段淮菠,以及修改方法,也不支持對資源的替換荤堪。
2.由于廠商的自定義ROM合陵,對少數(shù)機(jī)型暫不支持枢赔。兼容性差。

每個(gè)Java方法在art下面都對應(yīng)的一個(gè)ArtMethod結(jié)構(gòu)體拥知,ArtMethod記錄了這個(gè)Java方法的所有信息糠爬,包括所屬類,訪問權(quán)限举庶、代碼執(zhí)行地址执隧。通過evn->FromReflectedMethod,可以由Method對象得到這個(gè)方法對應(yīng)的ArtMethod的真正地址,然后就可以把它強(qiáng)轉(zhuǎn)為修復(fù)后的ArtMethod指針户侥,從而對其所有的成員進(jìn)行修改镀琉。這樣就全部替換完之后就完成了熱修復(fù)邏輯。以后調(diào)用這個(gè)方法時(shí)就會直接走到新方法的實(shí)現(xiàn)中了蕊唐。 然而由于andfix里面的ArtMethod的結(jié)構(gòu)體遵照android虛擬機(jī)art源碼里面的ArtMethod構(gòu)建的屋摔,各個(gè)手機(jī)廠商對這個(gè)ArtMethod結(jié)構(gòu)體進(jìn)行修改就會導(dǎo)致喝原來開源代碼里面的結(jié)構(gòu)不一致,那么在這個(gè)修改過的設(shè)備上替梨,替換機(jī)制就會出問題钓试,無法正常執(zhí)行熱修復(fù)邏輯。

熱修復(fù)技術(shù)實(shí)現(xiàn)的原理(Hotfix)

阿里百川Hotfix其實(shí)是阿里手機(jī)淘寶根據(jù)對Andfix的使用副瀑,對相關(guān)業(yè)務(wù)解偶后推出的弓熏,所以Andfix的缺點(diǎn)它也有。而且阿里已經(jīng)在此基礎(chǔ)上推出了更好的替代方案Sophix糠睡。所以這個(gè)這個(gè)以后基本上用不上了挽鞠。

熱修復(fù)技術(shù)實(shí)現(xiàn)的原理(Sophix)

阿里百川Hotfix其實(shí)是阿里手機(jī)淘寶根據(jù)對Andfix的使用,對相關(guān)業(yè)務(wù)解偶后推出的狈孔,所以Andfix的缺點(diǎn)它也有信认。而且阿里已經(jīng)在此基礎(chǔ)上推出了更好的替代方案Sophix。所以這個(gè)這個(gè)以后基本上用不上了均抽。

這個(gè)是阿里最新的一個(gè)解決方案嫁赏,下面這個(gè)是官網(wǎng)。
https://www.aliyun.com/product/hotfix

這個(gè)是掛在github上的Demo油挥。
https://github.com/aliyun/alicloud-android-demo/tree/master/hotfix_android_demo?spm=5176.doc53241.2.1.B9j904

阿里推出這個(gè)方案的同時(shí)出了本關(guān)于熱修復(fù)的書潦蝇,不止介紹了這個(gè)項(xiàng)目,而且介紹了很多熱修復(fù)的原理喘漏,和在探索熱修復(fù)時(shí)的一些思考护蝶,覺得還是值得好好看下的华烟,地址在這里:
深入探索Android熱修復(fù)技術(shù)原理

阿里系的熱修復(fù)對比

熱修復(fù)技術(shù)實(shí)現(xiàn)的原理(美團(tuán)Robust)

Robust插件對每個(gè)產(chǎn)品代碼的每個(gè)函數(shù)都在編譯打包階段自動(dòng)的插入了一段代碼翩迈,插入過程對業(yè)務(wù)開發(fā)是完全透明。在Application中通過DexClassLoader盔夜,將補(bǔ)丁class文件事先加載负饲,然后之后會調(diào)用新的class以替換舊apk中的bug class文件堤魁,通過反射進(jìn)行新代碼的調(diào)用,以達(dá)到熱修復(fù)目的返十。大致流程如下圖


Robust

美團(tuán)的官方地址:
https://tech.meituan.com/2016/09/14/android-robust.html

優(yōu)點(diǎn):
1妥泉、高兼容和適配性,由于是java代碼層面的替換調(diào)用洞坑,基本不涉及各個(gè)版本的適配和虛擬機(jī)的適配盲链。
缺點(diǎn):
1、由于對包體中的文件進(jìn)行了代碼侵入迟杂,對運(yùn)行效率刽沾、方法數(shù)、包體積都有影響排拷,文件方法數(shù)變多侧漓,企業(yè)級應(yīng)用可能會涉及到65535的問題。
2监氢、項(xiàng)目不夠成熟布蔗,文檔不夠健全。

熱修復(fù)技術(shù)實(shí)現(xiàn)的原理(QQ空間)

QQ空間基于的是dex分包方案浪腐。把BUG方法修復(fù)以后纵揍,放到一個(gè)單獨(dú)的dex補(bǔ)丁文件,讓程序運(yùn)行期間加載dex補(bǔ)丁议街,執(zhí)行修復(fù)后的方法骡男。如何做到這一點(diǎn)?

在Android中所有我們運(yùn)行期間需要的類都是由ClassLoader(類加載器)進(jìn)行加載傍睹。
因此讓ClassLoader加載全新的類替換掉出現(xiàn)Bug的類即可完成熱修復(fù)隔盛。

圖片6.png

熱修復(fù)技術(shù)實(shí)現(xiàn)的原理(Tinker)

重啟生效、反射拾稳、類加載吮炕、DexDiff

項(xiàng)目官網(wǎng):http://www.tinkerpatch.com/

Tinker 是開源項(xiàng)目Github的地址:https://github.com/Tencent/tinker
微信針對QQ空間超級補(bǔ)丁技術(shù)的不足提出了一個(gè)提供DEX差量包,整體替換DEX的方案访得。主要的原理是與QQ空間超級補(bǔ)丁技術(shù)基本相同龙亲,區(qū)別在于不再將patch.dex增加到elements數(shù)組中,而是差量的方式給出patch.dex悍抑,然后將patch.dex與應(yīng)用的classes.dex合并鳄炉,然后整體替換掉舊的DEX,達(dá)到修復(fù)的目的搜骡。(差分包拂盯,騰訊根據(jù)增量更新bspatch自己開發(fā)了一個(gè)dexdiff針對dex格式的,bsdiff算法計(jì)算差分與格式無關(guān)记靡,基于二進(jìn)制的谈竿,產(chǎn)物不穩(wěn)定)跟QQ空間的區(qū)別主要在于補(bǔ)丁包的生成不一樣团驱,后面拿到補(bǔ)丁包后是一樣的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末空凸,一起剝皮案震驚了整個(gè)濱河市嚎花,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌呀洲,老刑警劉巖紊选,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異道逗,居然都是意外死亡丛楚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進(jìn)店門憔辫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趣些,“玉大人,你說我怎么就攤上這事贰您』灯剑” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵锦亦,是天一觀的道長舶替。 經(jīng)常有香客問我,道長杠园,這世上最難降的妖魔是什么顾瞪? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮抛蚁,結(jié)果婚禮上陈醒,老公的妹妹穿的比我還像新娘。我一直安慰自己瞧甩,他們只是感情好钉跷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肚逸,像睡著了一般爷辙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上朦促,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天膝晾,我揣著相機(jī)與錄音,去河邊找鬼务冕。 笑死血当,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播歹颓,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼坯屿,長吁一口氣:“原來是場噩夢啊……” “哼油湖!你這毒婦竟也來了巍扛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤乏德,失蹤者是張志新(化名)和其女友劉穎撤奸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喊括,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胧瓜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了郑什。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片府喳。...
    茶點(diǎn)故事閱讀 39,769評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蘑拯,靈堂內(nèi)的尸體忽然破棺而出钝满,到底是詐尸還是另有隱情,我是刑警寧澤申窘,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布弯蚜,位于F島的核電站,受9級特大地震影響剃法,放射性物質(zhì)發(fā)生泄漏碎捺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一贷洲、第九天 我趴在偏房一處隱蔽的房頂上張望收厨。 院中可真熱鬧,春花似錦优构、人聲如沸帽氓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽黎休。三九已至,卻和暖如春玉凯,著一層夾襖步出監(jiān)牢的瞬間势腮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工漫仆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捎拯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓盲厌,卻偏偏與公主長得像署照,于是被迫代替她去往敵國和親祸泪。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評論 2 354

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