熱更新

熱更新調(diào)研
ps:本文是參考網(wǎng)上的資源而寫(xiě)的,參考鏈接如下:
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)開(kāi)源,冷啟動(dòng)修復(fù))
    百度金融: RocooFix:冷啟動(dòng)修復(fù))
    美麗說(shuō)蘑菇街:Aceso(實(shí)時(shí)修復(fù)
    360:RePlugin
    滴滴出行: VirtualAPK
    下圖是現(xiàn)有各大公司主要的熱修復(fù)解決方案

    熱修復(fù)現(xiàn)狀.png

  2. 熱修復(fù)開(kāi)發(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一樣都基于開(kāi)源框架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ù)開(kāi)發(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橫空出世,但是它不開(kāi)源,而且商業(yè)收費(fèi)(用戶量大的話會(huì)收費(fèi)),所以一般不是很賺錢(qián)的app選擇收費(fèi)的可能就很小了,不過(guò)它確實(shí)各方面都做了大量的優(yōu)化。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容