三分鐘的介紹
熱修復(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ù)技術(shù)實(shí)現(xiàn)的原理(AndFix)
Andfix 是支付寶提出的一種底層結(jié)構(gòu)替換的方案教沾,也達(dá)到了運(yùn)行時(shí)即時(shí)生效的效果,并且重要的是译断,做到了Dalvik和ART環(huán)境的全版本兼容授翻。
AndFix的原理就是方法的替換,把有bug的方法替換成補(bǔ)丁文件中的方法孙咪。在Native動(dòng)態(tài)替換Java層的方法堪唐,通過Native層hook Java層的代碼
優(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ù)技術(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ù)目的返十。大致流程如下圖
美團(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ù)隔盛。
熱修復(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ǔ)丁包后是一樣的。