熱更新

熱更新調(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é)

  1. 現(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

  2. 熱修復(fù)開發(fā)流程:
    上線--》安裝--》發(fā)現(xiàn)bug--》緊急修復(fù)--》打出補(bǔ)丁腰鬼,推送用戶--》自動(dòng)拉取補(bǔ)丁修復(fù)
    修復(fù)主要包含以下三方面:代碼修復(fù)、資源修復(fù)塑荒、so庫(kù)修復(fù)熄赡。

  3. 使用原理:追根溯源熱更新實(shí)現(xiàn)的基本原理,可以劃分為以Tinker為代表的multidex類加載法和以阿里Andfix為代表的底層替換法齿税,而阿里Sophix為了提高熱修復(fù)的成功率同時(shí)采用了上述兩種方案彼硫,并在兼容性上進(jìn)行了一定的優(yōu)化。

根據(jù)實(shí)現(xiàn)原理也可以把各家公司的解決方案按照下圖來(lái)分類:


熱修復(fù)按使用原理分類.png

或者更詳細(xì)技術(shù)原理凌箕,可以更細(xì)化分類如下:


詳細(xì)分類.png
  1. 技術(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解決方案

底層替換.png

優(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 :整體替換方式

Sophix.png

由于底層替換原理只支持方法替換调榄,不支持方法的增加和減少,成員字段的增加和減少呵扛,所以我們需要知道哪些修改會(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的目的。

Install Run熱插拔原理.png

優(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)了

  1. 各家公司產(chǎn)品對(duì)比:
Sophix對(duì)比.png
Tinker對(duì)比.png

Qzone對(duì)比.png
  1. 總結(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)化。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末巩踏,一起剝皮案震驚了整個(gè)濱河市秃诵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌塞琼,老刑警劉巖菠净,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡毅往,警方通過(guò)查閱死者的電腦和手機(jī)牵咙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)攀唯,“玉大人洁桌,你說(shuō)我怎么就攤上這事『钹郑” “怎么了另凌?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)残拐。 經(jīng)常有香客問(wèn)我途茫,道長(zhǎng)碟嘴,這世上最難降的妖魔是什么溪食? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮娜扇,結(jié)果婚禮上错沃,老公的妹妹穿的比我還像新娘。我一直安慰自己雀瓢,他們只是感情好枢析,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刃麸,像睡著了一般醒叁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泊业,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天把沼,我揣著相機(jī)與錄音,去河邊找鬼吁伺。 笑死饮睬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的篮奄。 我是一名探鬼主播捆愁,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼槐臀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼荠列!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起簿废,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤夸赫,失蹤者是張志新(化名)和其女友劉穎菩帝,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胁附,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年酒繁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片控妻。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡州袒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弓候,到底是詐尸還是另有隱情郎哭,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布菇存,位于F島的核電站夸研,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏依鸥。R本人自食惡果不足惜亥至,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贱迟。 院中可真熱鬧姐扮,春花似錦、人聲如沸衣吠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)缚俏。三九已至惊搏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間忧换,已是汗流浹背恬惯。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留包雀,地道東北人宿崭。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像才写,于是被迫代替她去往敵國(guó)和親葡兑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

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