熱更新調(diào)研
ps:本文是參考網(wǎng)上的資源而寫的蜒秤,參考鏈接如下:
Android熱修復(fù)技術(shù)原理詳解
Android熱更新技術(shù)總結(jié)
Android熱修復(fù)技術(shù)總結(jié)
阿里最新熱修復(fù)Sophix與QQ超級(jí)補(bǔ)丁和Tinker的實(shí)現(xiàn)與總結(jié)
-
現(xiàn)有解決方案:
騰訊系:Tinker (冷啟動(dòng)修復(fù))丈探、Qzone超級(jí)補(bǔ)丁(冷啟動(dòng)修復(fù))金踪、QFix(冷啟動(dòng)修復(fù))
阿里系:Andfix (native hook 實(shí)時(shí)修復(fù))钠龙、Sophix 新一代(實(shí)時(shí)修復(fù)+冷啟動(dòng)修復(fù))凿试、Xposed (不支持Art虛擬機(jī)宽涌,已廢棄) Dexposed(思想來(lái)源于Xposed)
美團(tuán):Robust 每個(gè)函數(shù)插入額外邏輯(實(shí)時(shí)修復(fù))
餓了嗎:Amigo(冷啟動(dòng)修復(fù))
大眾點(diǎn)評(píng):Nuwa(參考Qzone實(shí)現(xiàn)開源揩徊,冷啟動(dòng)修復(fù))
百度金融: RocooFix:冷啟動(dòng)修復(fù))
美麗說(shuō)蘑菇街:Aceso(實(shí)時(shí)修復(fù))
360:RePlugin
滴滴出行: VirtualAPK
下圖是現(xiàn)有各大公司主要的熱修復(fù)解決方案
熱修復(fù)現(xiàn)狀.png 熱修復(fù)開發(fā)流程:
上線--》安裝--》發(fā)現(xiàn)bug--》緊急修復(fù)--》打出補(bǔ)丁腰鬼,推送用戶--》自動(dòng)拉取補(bǔ)丁修復(fù)
修復(fù)主要包含以下三方面:代碼修復(fù)、資源修復(fù)塑荒、so庫(kù)修復(fù)熄赡。使用原理:追根溯源熱更新實(shí)現(xiàn)的基本原理,可以劃分為以Tinker為代表的multidex類加載法和以阿里Andfix為代表的底層替換法齿税,而阿里Sophix為了提高熱修復(fù)的成功率同時(shí)采用了上述兩種方案彼硫,并在兼容性上進(jìn)行了一定的優(yōu)化。
根據(jù)實(shí)現(xiàn)原理也可以把各家公司的解決方案按照下圖來(lái)分類:
或者更詳細(xì)技術(shù)原理凌箕,可以更細(xì)化分類如下:
- 技術(shù)原理與特點(diǎn):
Tinker : Multidex類加載法:
在android5.0之前拧篮,每個(gè)android應(yīng)用只含有一個(gè)dex文件,dex的方法數(shù)量被限制在了65535之內(nèi)牵舱,導(dǎo)致apk引入大量第三方sdk后方法數(shù)量超過(guò)限制無(wú)法編譯通過(guò)串绩。為了解決這個(gè)問(wèn)題,Google推出多dex文件的解決方案multidex芜壁,一個(gè)apk可以包含多個(gè)dex文件礁凡。通過(guò)Multidex.install(this)完成dex文件的加載。
Tinker方案參考multidex實(shí)現(xiàn)原理慧妄,在編譯時(shí)通過(guò)新舊兩個(gè)Dex生成差異patch.dex顷牌。在運(yùn)行時(shí),將差異patch.dex重新和原始安裝包的舊Dex合并還原為新的Dex塞淹。這個(gè)過(guò)程可能比較耗費(fèi)時(shí)間與內(nèi)存窟蓝,所以tinker單獨(dú)放在一個(gè)后臺(tái)進(jìn)程:patch中處理。為了補(bǔ)丁包盡量的小饱普,微信自研了DexDiff算法运挫,它深度利用Dex的格式來(lái)減少差異的大小状共。
優(yōu)點(diǎn):
支持動(dòng)態(tài)下發(fā)代碼
支持替換So庫(kù)以及資源
缺點(diǎn):
由于采用ClassLoader機(jī)制,所以需要app重啟滑臊。由于類加載實(shí)現(xiàn)原理涉及dex文件的重新解壓縮合并等處理口芍,消耗內(nèi)存大箍铲,耗時(shí)長(zhǎng)雇卷,在系統(tǒng)低內(nèi)存時(shí)容易導(dǎo)致熱更新失敗,騰訊測(cè)試成功率大概為95%颠猴。
Andfix : 底層替換方案
底層替換是在已經(jīng)加載了的類中直接在native層用新的方法替換掉原有的出現(xiàn)bug的方法关划。與Dexposed一樣都基于開源框架Xposed實(shí)現(xiàn),是一種AOP解決方案
優(yōu)點(diǎn)是: 即時(shí)生效,支持dalvik和art(AndFix supports Android version from 2.3 to 7.0, both ARM and X86 architecture, both Dalvik and ART runtime, both 32bit and 64bit.)
與Dexposed框架相比, AndFix框架更加輕便好用翘瓮,在進(jìn)行熱修復(fù)的過(guò)程中更加方便了贮折。
缺點(diǎn)是:面臨穩(wěn)定性與兼容性問(wèn)題
AndFix不支持新增方法,新增類资盅,新增field等
Sophix :整體替換方式
由于底層替換原理只支持方法替換调榄,不支持方法的增加和減少,成員字段的增加和減少呵扛,所以我們需要知道哪些修改會(huì)導(dǎo)致方法每庆,字段的改變,從而導(dǎo)致底層替換熱部署失效今穿。Sophix改變了一下思路缤灵,采用整體替換方法結(jié)構(gòu),忽略底層實(shí)現(xiàn)蓝晒,從而解決兼容穩(wěn)定性問(wèn)題腮出。
Dalvik下采用阿里自研的全量dex方案:不是考慮把補(bǔ)丁包的dex插到所有dex前面(dex插樁),而是想辦法在原理的dex中刪除(只是刪除了類的定義)補(bǔ)丁dex中存在的類芝薇,這樣讓系統(tǒng)查找類的時(shí)候在原來(lái)的dex中找不到胚嘲,那么只有補(bǔ)丁中的dex加載到系統(tǒng)中,系統(tǒng)自然就會(huì)從補(bǔ)丁包中找到對(duì)應(yīng)的類洛二。
優(yōu)點(diǎn)是實(shí)現(xiàn)熱部署馋劈,修改及時(shí)生效,支持代碼修復(fù)灭红、資源修復(fù)侣滩、so庫(kù)修復(fù)。
美團(tuán)Robust :Instant Run 熱插拔原理
Robust插件對(duì)每個(gè)產(chǎn)品代碼的每個(gè)函數(shù)都在編譯打包階段自動(dòng)的插入了一段代碼变擒,插入過(guò)程對(duì)業(yè)務(wù)開發(fā)是完全透明的君珠。
編譯打包階段自動(dòng)為每個(gè)class都增加了一個(gè)類型為ChangeQuickRedirect的靜態(tài)成員,而在每個(gè)方法前都插入了使用changeQuickRedirect相關(guān)的邏輯娇斑,當(dāng) changeQuickRedirect不為null時(shí)策添,可能會(huì)執(zhí)行到accessDispatch從而替換掉之前老的邏輯材部,達(dá)到fix的目的。
優(yōu)點(diǎn):
幾乎不會(huì)影響性能(方法調(diào)用唯竹,冷啟動(dòng))
支持Android2.3-8.x版本
高兼容性(Robust只是在正常的使用DexClassLoader)乐导、高穩(wěn)定性,修復(fù)成功率高達(dá)99.9%
補(bǔ)丁實(shí)時(shí)生效浸颓,不需要重新啟動(dòng)
支持方法級(jí)別的修復(fù)物臂,包括靜態(tài)方法
支持增加方法和類
支持ProGuard的混淆、內(nèi)聯(lián)产上、優(yōu)化等操作
缺點(diǎn):
代碼是侵入式的棵磷,會(huì)在原有的類中加入相關(guān)代碼
so和資源的替換暫時(shí)不支持
會(huì)增大apk的體積,平均一個(gè)函數(shù)會(huì)比原來(lái)增加17.47個(gè)字節(jié)晋涣,10萬(wàn)個(gè)函數(shù)會(huì)增加1.67M仪媒。
會(huì)增加少量方法數(shù),使用了Robust插件后谢鹊,原來(lái)能被ProGuard內(nèi)聯(lián)的函數(shù)不能被內(nèi)聯(lián)了
- 各家公司產(chǎn)品對(duì)比:
- 總結(jié):如果不考慮增大apk的體積算吩,只是簡(jiǎn)單的修復(fù)代碼,不修復(fù)so和資源佃扼,選擇美團(tuán)的 Robust是最穩(wěn)定的偎巢,否則的話選擇Tinker是一個(gè)不錯(cuò)的方案。目前騰訊的 Tinker基本可以滿足app的熱更新需求松嘶,但隨著app用戶規(guī)模不斷增大艘狭,業(yè)務(wù)需求日益復(fù)雜,可考慮阿里的sophix商業(yè)方案翠订,sophix同時(shí)應(yīng)用類加載和底層替換兩種方案巢音,具有底層替換的修改及時(shí)性,和類加載方案的兼容性等優(yōu)點(diǎn)尽超。雖然阿里Sophix橫空出世官撼,但是它不開源,而且商業(yè)收費(fèi)(用戶量大的話會(huì)收費(fèi))似谁,所以一般不是很賺錢的app選擇收費(fèi)的可能就很小了傲绣,不過(guò)它確實(shí)各方面都做了大量的優(yōu)化。