Android熱修復(fù)技術(shù)原理詳解(最新最全版本)

自己開發(fā)app到上架應(yīng)用市場需要經(jīng)歷什么奴拦?https://www.cnblogs.com/popfisher/p/14218431.html

本文框架

什么是熱修復(fù)?

熱修復(fù)框架分類

技術(shù)原理及特點(diǎn)

Tinker框架解析

各框架對比圖

總結(jié)

??通過閱讀本文届吁,你會對熱修復(fù)技術(shù)有更深的認(rèn)知错妖,本文會列出各類框架的優(yōu)缺點(diǎn)以及技術(shù)原理,文章末尾簡單描述一下Tinker的框架結(jié)構(gòu)疚沐。

一暂氯、什么是熱修復(fù)?

正常開發(fā)流程

熱修復(fù)開發(fā)流程

熱修復(fù)優(yōu)勢

修復(fù)什么亮蛔?

二痴施、熱修復(fù)框架分類

現(xiàn)狀:百花齊放百家爭鳴

簡單分類

更合理的分類

三、技術(shù)原理及特點(diǎn)

3.1 阿里Dexposed -- native解決方案

原理:

直接在native層進(jìn)行方法的結(jié)構(gòu)體信息對換,從而實(shí)現(xiàn)完美的方法新舊替換辣吃,從而實(shí)現(xiàn)熱修復(fù)功能

??他的思想完全來源于Xposed框架动遭,完美詮釋了AOP編程,這里用到最核心的知識點(diǎn)就是在native層獲取到指定方法的結(jié)構(gòu)體神得,然后改變他的nativeFunc字段值厘惦,而這個(gè)值就是可以指定這個(gè)方法對應(yīng)的native函數(shù)指針,所以先從Java層跳到native層哩簿,改變指定方法的nativeFunc值宵蕉,然后在改變之后的函數(shù)中調(diào)用Java層的回調(diào)即可。實(shí)現(xiàn)了方法的攔截功能节榜。

基于開源框架Xposed實(shí)現(xiàn)羡玛,是一種AOP解決方案

只Hook App本身的進(jìn)程,不需要Root權(quán)限

優(yōu)點(diǎn):

即時(shí)生效

不需要任何編譯器的插樁或者代碼改寫稼稿,對正常運(yùn)行不引入任何性能開銷浓若。這是AspectJ之類的框架沒法比擬的優(yōu)勢;

對所改寫方法的性能開銷也極低(微秒級)挪钓,基本可以忽略不計(jì);

從工程的角度來看倚评,熱補(bǔ)丁僅僅是牛刀小試,它真正的威力在于『線上調(diào)試』天梧;

基于Xposed原理實(shí)現(xiàn)的AOP不僅可以hook自己的代碼霞丧,還可以hook同進(jìn)程的Android SDK代碼,這也就可以讓我們有能力在App中填上Google自己挖的坑蛹尝。

缺點(diǎn):

Dalvik上近乎完美,不支持ART(需要另外的實(shí)現(xiàn)方式)挫酿,所以5.0以上不能用了;

最大挑戰(zhàn)在于穩(wěn)定性與兼容性愕难,而且native異常排查難度更高早龟;

由于無法增加變量與類等限制惫霸,無法做到功能發(fā)布級別;

相關(guān)鏈接:

文章:https://www.zhihu.com/question/31894163

文章:

http://www.wjdiankong.cn/android%E4%B8%AD%E5%85%8Droot%E5%AE%9E%E7%8E%B0hook%E7%9A%84dexposed%E6%A1%86%E6%9E%B6%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90%E4%BB%A5%E5%8F%8A%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0/

Dexposed源碼:https://github.com/alibaba/dexposed

Xposed源碼:https://github.com/rovo89/Xposed

3.2 阿里AndFix -- native解決方案

原理:

與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ù)的過程中更加方便了

缺點(diǎn):

面臨穩(wěn)定性與兼容性問題

AndFix不支持新增方法,新增類芝加,新增field等

AndFix(Dexpsed)框架不穩(wěn)定的原因(痛點(diǎn))

相關(guān)鏈接:

文章:https://zhuanlan.zhihu.com/p/23935568

AndFix源碼:https://github.com/alibaba/AndFix

3.3 QQ空間--Dex插樁方案(大眾點(diǎn)評的Nuwa參考其實(shí)現(xiàn)并開源)

原理:

原理是Hook了ClassLoader.pathList.dexElements[]茫打。因?yàn)镃lassLoader的findClass是通過遍歷dexElements[]中的dex來尋找類的。當(dāng)然為了支持4.x的機(jī)型妖混,需要打包的時(shí)候進(jìn)行插樁。

越靠前的Dex優(yōu)先被系統(tǒng)使用轮洋,基于類級別的修復(fù)

優(yōu)點(diǎn):

不需要考慮對dalvik虛擬機(jī)和art虛擬機(jī)做適配

代碼是非侵入式的制市,對apk體積影響不大

缺點(diǎn):

需要下次啟動才會生效

最大挑戰(zhàn)在于性能,即Dalvik平臺存在插樁導(dǎo)致的性能損耗弊予,Art平臺由于地址偏移問題導(dǎo)致補(bǔ)丁包可能過大的問題

虛擬機(jī)在安裝期間為類打上CLASS_ISPREVERIFIED標(biāo)志是為了提高性能的祥楣,我們強(qiáng)制防止類被打上標(biāo)志是否會影響性能?這里我們會做一下更加詳細(xì)的性能測試.但是在大項(xiàng)目中拆分dex的問題已經(jīng)比較嚴(yán)重汉柒,很多類都沒有被打上這個(gè)標(biāo)志误褪。

插樁方案性能上的痛點(diǎn):

相關(guān)鏈接:

文章:https://zhuanlan.zhihu.com/magilu/20308548

文章:http://blog.csdn.net/sbsujjbcy/article/details/50812674

Nuwa源碼:https://github.com/jasonross/Nuwa

HotFix源碼:https://github.com/dodola/HotFix

DroidFix源碼:https://github.com/bunnyblue/DroidFix

3.4 美團(tuán)Robust -- Instant Run 熱插拔原理

原理:

Robust插件對每個(gè)產(chǎn)品代碼的每個(gè)函數(shù)都在編譯打包階段自動的插入了一段代碼,插入過程對業(yè)務(wù)開發(fā)是完全透明

編譯打包階段自動為每個(gè)class都增加了一個(gè)類型為ChangeQuickRedirect的靜態(tài)成員碾褂,而在每個(gè)方法前都插入了使用changeQuickRedirect相關(guān)的邏輯兽间,當(dāng)

changeQuickRedirect不為null時(shí),可能會執(zhí)行到accessDispatch從而替換掉之前老的邏輯正塌,達(dá)到fix的目的嘀略。

優(yōu)點(diǎn):

幾乎不會影響性能(方法調(diào)用帜羊,冷啟動)

支持Android2.3-8.x版本

高兼容性(Robust只是在正常的使用DexClassLoader)讼育、高穩(wěn)定性奶段,修復(fù)成功率高達(dá)99.9%

補(bǔ)丁實(shí)時(shí)生效忧饭,不需要重新啟動

支持方法級別的修復(fù)词裤,包括靜態(tài)方法

支持增加方法和類

支持ProGuard的混淆吼砂、內(nèi)聯(lián)渔肩、優(yōu)化等操作

缺點(diǎn):

代碼是侵入式的周偎,會在原有的類中加入相關(guān)代碼

so和資源的替換暫時(shí)不支持

會增大apk的體積蓉坎,平均一個(gè)函數(shù)會比原來增加17.47個(gè)字節(jié)蛉艾,10萬個(gè)函數(shù)會增加1.67M勿侯。

會增加少量方法數(shù)助琐,使用了Robust插件后弓柱,原來能被ProGuard內(nèi)聯(lián)的函數(shù)不能被內(nèi)聯(lián)了

相關(guān)鏈接:

美團(tuán)技術(shù)文章:https://tech.meituan.com/android_robust.html

美團(tuán)技術(shù)文章:https://tech.meituan.com/android_autopatch.html

Robust源碼:https://github.com/Meituan-Dianping/Robust

3.5 微信Tinker

原理:

服務(wù)端做dex差量航罗,將差量包下發(fā)到客戶端粥血,在ART模式的機(jī)型上本地跟原apk中的classes.dex做merge复亏,merge成為一個(gè)新的merge.dex后將merge.dex插入pathClassLoader的dexElement缔御,原理類同Q-Zone耕突,為了實(shí)現(xiàn)差量包的最小化,Tinker自研了DexDiff/DexMerge算法炕泳。Tinker還支持資源和So包的更新培遵,So補(bǔ)丁包使用BsDiff來生成籽腕,資源補(bǔ)丁包直接使用文件md5對比來生成节仿,針對資源比較大的(默認(rèn)大于100KB屬于大文件)會使用BsDiff來對文件生成差量補(bǔ)丁。

優(yōu)點(diǎn):

支持動態(tài)下發(fā)代碼

支持替換So庫以及資源

缺點(diǎn):

不能即時(shí)生效,需要下次啟動

Tinker已知問題:

Tinker不支持修改AndroidManifest.xml蛉迹,Tinker不支持新增四大組件(1.9.0支持新增非export的Activity)北救;

由于Google Play的開發(fā)者條款限制珍策,不建議在GP渠道動態(tài)更新代碼攘宙;

在Android N上蹭劈,補(bǔ)丁對應(yīng)用啟動時(shí)間有輕微的影響铺韧;

不支持部分三星android-21機(jī)型哈打,加載補(bǔ)丁時(shí)會主動拋出"TinkerRuntimeException:checkDexInstall failed";

對于資源替換患雏,不支持修改remoteView淹仑。例如transition動畫匀借,notification icon以及桌面圖標(biāo)吓肋。

Tinker性能痛點(diǎn):

Dex合并內(nèi)存消耗在vm head上是鬼,容易OOM均蜜,最后導(dǎo)致合并失敗芒率。

如果本身app占用內(nèi)存已經(jīng)比較高充择,可能容易導(dǎo)致app本系統(tǒng)殺掉椎麦。

相關(guān)鏈接:

文章:http://geek.csdn.net/news/detail/104000

文章:Tinker官方文章

Tinker源碼:https://github.com/Tencent/tinker

3.6 阿里Sophix

原理(雙劍合璧):

優(yōu)化Andfix(突破底層結(jié)構(gòu)差異铃剔,解決穩(wěn)定性問題):

Andfix底層ArtMethod結(jié)構(gòu)時(shí)采用內(nèi)部變量一一替換键兜,倒是這個(gè)各個(gè)廠商是會修改的普气,所以兼容性不好现诀。

Sophix改變了一下思路仔沿,采用整體替換方法結(jié)構(gòu)封锉,忽略底層實(shí)現(xiàn)成福,從而解決兼容穩(wěn)定性問題。

突破QQ和Tinker的缺陷

QQ和Tinker的缺陷

Sophix對dex的解決方案

Dalvik下采用阿里自研的全量dex方案:不是考慮把補(bǔ)丁包的dex插到所有dex前面(dex插樁),而是想辦法在原理的dex中刪除(只是刪除了類的定義)補(bǔ)丁dex中存在的類像啼,這樣讓系統(tǒng)查找類的時(shí)候在原來的dex中找不到埋合,那么只有補(bǔ)丁中的dex加載到系統(tǒng)中,系統(tǒng)自然就會從補(bǔ)丁包中找到對應(yīng)的類秀菱。

Art下本質(zhì)上虛擬機(jī)以及支持多dex的加載衍菱,Sophix的做法僅僅是把補(bǔ)丁dex作為主dex(classes.dex)而已脊串,相當(dāng)于重新組織了所有的dex文件:把補(bǔ)丁包的dex改名為classes.dex琼锋,以前apk的所有dex依次改為classes2.dex缕坎、classes3.dex

... classesx.dex谜叹,如下圖所示。

資源修復(fù)另辟蹊徑

常用方案(Instant Run技術(shù)):這種方案的兼容問題在于替換AssetManager的地方

Sophix資源修復(fù)方案

SO修復(fù)另辟蹊徑

四女仰、Tinker框架解析

??之所以只貼了Tinker的代碼框架董栽,是因?yàn)槟壳伴_源的方案中是最好的锭碳,當(dāng)然除了Robust。

代碼結(jié)構(gòu)

修復(fù)流程

這里后續(xù)再補(bǔ)一個(gè)詳細(xì)的源碼分析,敬請期待

五歹撒、對比圖(來自不同的地方)

來自Tinker的對比

來自Sophix的對比

來自蘑菇街 Android 熱修復(fù)探索之路

其他文章

淺談Android熱修復(fù):

http://blog.csdn.net/caihongdao123/article/details/52051799

Android 熱修復(fù)專題:支付寶、淘寶迈着、微信邪码、QQ空間奴潘、餓了么画髓、美麗說蘑菇街平委、美團(tuán)大眾點(diǎn)評方案集https://zhuanlan.zhihu.com/p/25863920

六予权、總結(jié)

??如果不考慮增大apk的體積浪册,只是簡單的修復(fù)代碼笆环,不修復(fù)so和資源躁劣,選擇Robust是最穩(wěn)定的账忘,否則的話選擇Tinker是一個(gè)不錯的方案鳖擒。雖然阿里Sophix橫空出世蒋荚,但是它不開源期升,而且商業(yè)收費(fèi)互躬,所以一般不是很賺錢的app選擇收費(fèi)的可能就很小了吨铸。不過它確實(shí)各方面都做了大量的優(yōu)化诞吱,本文中的很多知識點(diǎn)也來源于阿里的《Android熱修復(fù)技術(shù)原理.pdf》一書,本書值得一讀抬纸,里面就是基于Sophix框架來編排的。

GitHub文章地址

FavoriteForAndroid-Android熱修復(fù)技術(shù)原理

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市皂股,隨后出現(xiàn)的幾起案子呜呐,更是在濱河造成了極大的恐慌,老刑警劉巖洋魂,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異址晕,居然都是意外死亡谨垃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門匙隔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人再膳,你說我怎么就攤上這事喂柒。” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵灾杰,是天一觀的道長蚊丐。 經(jīng)常有香客問我,道長吭露,這世上最難降的妖魔是什么吠撮? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮讲竿,結(jié)果婚禮上泥兰,老公的妹妹穿的比我還像新娘。我一直安慰自己鞋诗,他們只是感情好秀仲,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布保礼。 她就那樣靜靜地躺著胁赢,像睡著了一般智末。 火紅的嫁衣襯著肌膚如雪螟凭。 梳的紋絲不亂的頭發(fā)上下隧,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機(jī)與錄音拷淘,去河邊找鬼结洼。 笑死挽铁,一個(gè)胖子當(dāng)著我的面吹牛玖雁,可吹牛的內(nèi)容都是我干的浓镜。 我是一名探鬼主播哄啄,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼禽车,長吁一口氣:“原來是場噩夢啊……” “哼钦勘!你這毒婦竟也來了肛响?” 一聲冷哼從身側(cè)響起巾兆,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤堤如,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后唧取,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體媒区,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡座掘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疏遏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蚌吸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扒俯,到底是詐尸還是另有隱情,我是刑警寧澤兔院,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布接校,位于F島的核電站,受9級特大地震影響窝趣,放射性物質(zhì)發(fā)生泄漏幻馁。R本人自食惡果不足惜膘滨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一铲咨、第九天 我趴在偏房一處隱蔽的房頂上張望隆檀。 院中可真熱鬧坚冀,春花似錦液南、人聲如沸萍嬉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽覆履。三九已至星掰,卻和暖如春缸棵,著一層夾襖步出監(jiān)牢的瞬間木柬,已是汗流浹背蛮放。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工拍皮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撵割,地道東北人贿堰。 一個(gè)月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像啡彬,于是被迫代替她去往敵國和親羹与。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

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