Android—常用熱修復(fù)框架

前言

熱修復(fù)即<打補(bǔ)丁>,當(dāng)一個(gè)app上線后,如果發(fā)現(xiàn)重大的bug零院,需要緊急修復(fù)溉跃。常規(guī)的做法是修復(fù)bug,然后重新打包告抄,再上線到各個(gè)渠道撰茎。這種方式的成本高,效率低打洼。

于是熱修復(fù)技術(shù)應(yīng)運(yùn)而生龄糊,熱修復(fù)技術(shù)一般的做法是應(yīng)用啟動(dòng)的時(shí)候,主動(dòng)去服務(wù)端查詢是否有補(bǔ)丁包募疮,有就下載下來炫惩,并在下一次啟動(dòng)的時(shí)候生效,這樣就可以快速解決線上的緊急bug阿浓。


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

無需重新打包發(fā)布安裝包他嚷,用戶無感知修復(fù),無需下載最新的應(yīng)用芭毙,節(jié)省用戶流量筋蓖;修復(fù)的成功率高,避免線上bug帶來的業(yè)務(wù)損失退敦,把損失率降到最低粘咖。

熱修復(fù)原理

熱修復(fù)的原理主要是類替換。類的替換就涉及到ClassLoader的使用苛聘,Android中可用來動(dòng)態(tài)加載代碼的ClassLoader有PathClassLoader涂炎、DexClassLoader。

因?yàn)镻athClassLoader在Dalvik虛擬機(jī)中只能用來加載已安裝apk的類设哗,而DexClassLoader在Dalvik和ART虛擬機(jī)中都能加載未安裝apk或者dex中的類唱捣,所以熱修復(fù)使用DexClassLoader來加載補(bǔ)丁包中的類。

我們可以使用DexClassLoader加載我們的補(bǔ)丁网梢,再利用反射獲取到PathClassLoader中的dexElements震缭,以及DexClassLoader中的dexElements,將二者合并(補(bǔ)丁放前面战虏,原來的放后面)拣宰,再通過反射重新賦值給PathClassLoader中的dexElements,這樣實(shí)現(xiàn)了熱修復(fù)的效果烦感。

實(shí)時(shí)修復(fù)

替換方案限制多巡社,但是時(shí)效性好,加載輕快手趣,立即見效晌该;
在已經(jīng)加載的類中替換掉原來的方法,基于原有的類修改;
既然是基于原有的類朝群,這個(gè)方案無法對(duì)類中方法和字段進(jìn)行增減燕耿,因?yàn)檫@樣會(huì)破壞類的結(jié)構(gòu)。

冷啟動(dòng)修復(fù)

冷啟動(dòng)修復(fù)就是合成全新的dex文件來替換原有的dex文件(dex文件包含了所有app代碼)姜胖,其作用在于突破熱替換方案無法新增類方法的限制誉帅,如果代碼變動(dòng)大,比如在已存在的類中新增方法右莱,修改了so等情況蚜锨,可以更好的達(dá)到修復(fù)目的。

常用熱修復(fù)框架

Dexposed框架:Star 4.4k

阿里——開源——實(shí)時(shí)修復(fù)
項(xiàng)目地址:https://github.com/alibaba/dexposed

介紹

Dexposed是一個(gè)阿里巴巴手機(jī)淘寶基于開源Xposed框架項(xiàng)目的工作隧出,Dexposed是一個(gè)功能強(qiáng)大且非侵入性的運(yùn)行時(shí)AOP(面向方面的編程)框架踏志,用于Android應(yīng)用程序開發(fā)。

Dexposed的AOP完全是非侵入性的胀瞪,無需任何注釋處理器针余,編織器或字節(jié)碼重寫器。集成就像在應(yīng)用程序的初始化階段僅用一行代碼加載一個(gè)小的JNI庫一樣簡(jiǎn)單凄诞。

不僅可以掛鉤您的應(yīng)用程序代碼圆雁,而且還可以掛鉤在您的應(yīng)用程序進(jìn)程中運(yùn)行的Android框架代碼。此功能在Android開發(fā)中非常有用帆谍,因?yàn)槲覀兊拈_發(fā)人員嚴(yán)重依賴零散的舊版Android平臺(tái)(SDK)伪朽。

與動(dòng)態(tài)類加載一起,可以將一小段已編譯的Java AOP代碼加載到正在運(yùn)行的應(yīng)用程序中汛蝙,從而有效地改變目標(biāo)應(yīng)用程序的行為而無需重新啟動(dòng)烈涮。

使用

該框架最后一次的提交記錄是2015年10月21日,已經(jīng)停止更新很久了窖剑,暫不推薦使用

AndFix框架:Star 6.9k

阿里——開源——實(shí)時(shí)修復(fù)
項(xiàng)目地址:https://github.com/alibaba/AndFix

介紹

AndFix是一種在線修復(fù)錯(cuò)誤而不是重新分發(fā)Android App的解決方案坚洽,它作為Android庫分發(fā)。

AndFix支持Android版本從2.3到7.0西土,ARM和X86體系結(jié)構(gòu)讶舰,Dalvik和ART運(yùn)行時(shí)(32位和64位)。

AndFix補(bǔ)丁的壓縮文件格式為.apatch需了,它從您自己的服務(wù)器分發(fā)到客戶端跳昼,以修復(fù)您的應(yīng)用程序錯(cuò)誤。

使用

該框架最后一次的提交記錄是2016年12月26日肋乍,已經(jīng)停止更新很久了鹅颊,暫不推薦使用

阿里百川HotFix框架:

阿里——未開源——實(shí)時(shí)修復(fù)
地址:http://baichuan.taobao.com/product/hotfix.htm

介紹

阿里百川HotFix是阿里百川旗下全平臺(tái)App熱修復(fù)服務(wù)方案,產(chǎn)品基于阿里巴巴首創(chuàng)hotpatch技術(shù)墓造,提供最細(xì)粒度熱修復(fù)能力堪伍。

使用

該框架最后一次的更新時(shí)間是2017年6月7日
阿里熱修復(fù)Sophix已全面升級(jí)至3.0历帚,可以參考官方文檔的接入說明進(jìn)行快速集成使用

Qzone超級(jí)補(bǔ)丁框架:

QQ空間——未開源——冷啟動(dòng)修復(fù)

介紹

Qzone 超級(jí)補(bǔ)丁技術(shù)基于dex分包方案,使用了多dex加載(multidex)的原理杠娱,大致的過程就是:把BUG方法修復(fù)以后,放到一個(gè)單獨(dú)的dex文件谱煤,然后插入到dexElements數(shù)組的最前面摊求,讓虛擬機(jī)去加載修復(fù)完后的方法。

QFix框架:

手Q團(tuán)隊(duì)——開源——冷啟動(dòng)修復(fù)

介紹

QFix 是手Q團(tuán)隊(duì)推出的一種新的 Android 熱補(bǔ)丁方案刘离,在不影響 App 運(yùn)行時(shí)性能(無需插樁去 preverify)的前提下有效地規(guī)避了 dalvik 下”unexpected DEX”的異常室叉,而且還是很輕量級(jí)的實(shí)現(xiàn):只需調(diào)用一個(gè)很簡(jiǎn)單的方法就能辦到。

Robust框架:Star 4k

美團(tuán)——開源——實(shí)時(shí)修復(fù)
地址:https://github.com/Meituan-Dianping/Robust

介紹

Robust是美團(tuán)開發(fā)的一套熱更新方案硫惕,它是基于Instant Run原理開發(fā)的一套新框架茧痕,相比于Tinker這種改變DexElements加載順序的方式只能重啟生效,robust實(shí)現(xiàn)了對(duì)代碼修改的實(shí)時(shí)生效(熱插拔)恼除。

使用

該框架最后一次的更新時(shí)間是2020年4月13日踪旷,詳細(xì)使用說明可以參考官方文檔。

Nuwa框架:

大眾點(diǎn)評(píng)——參考Qzone實(shí)現(xiàn)開源——冷啟動(dòng)修復(fù)
地址:https://github.com/jasonross/Nuwa

介紹

女媧是中國(guó)古代神話中的女神豁辉,以修復(fù)天柱而聞名令野。

通過此Nuwa項(xiàng)目,您還可以具有修復(fù)能力徽级,無需將新的APK發(fā)布到appstore即可修復(fù)您的android應(yīng)用程序气破。

使用

該框架最后一次的更新時(shí)間是2015年11月14日,已經(jīng)停止更新很久了餐抢,暫不推薦使用

RocooFix框架:Star 1.6k

百度金融——開源——冷啟動(dòng)修復(fù)
地址:https://github.com/dodola/RocooFix

使用

該框架最后一次的更新時(shí)間是2016年6月26日现使,已經(jīng)停止更新很久了,暫不推薦使用

Aceso框架:Star 790

美麗說蘑菇街——開源——實(shí)時(shí)修復(fù)
地址:https://github.com/meili/Aceso

介紹

Aceso是通過優(yōu)化AOSP的<InstantRun HotSwap>解決方案而開發(fā)的Android HotFix旷痕,用于修復(fù)在線錯(cuò)誤碳锈,而無需發(fā)布新的APK。

使用

該框架最后一次的更新時(shí)間是2018年1月31日苦蒿,詳細(xì)使用說明可以參考官方文檔殴胧。

Amigo框架:Star 1.4k

餓了么——開源——冷啟動(dòng)修復(fù)
地址:https://github.com/eleme/Amigo

介紹

Amigo是一個(gè)修補(bǔ)程序庫,可以為您的Android應(yīng)用程序修復(fù)所有問題佩迟。

使用

該框架最后一次的更新時(shí)間是2017年8月21日团滥,詳細(xì)使用說明可以參考官方文檔。

Tinker框架:

微信——開源——冷啟動(dòng)修復(fù)

地址:https://github.com/Tencent/tinker

介紹

Tinker是適用于Android的修補(bǔ)程序庫报强,它支持dex灸姊,庫和資源更新,而無需重新安裝apk秉溉。

使用

該框架最后一次的更新時(shí)間是2021年4月19日力惯,詳細(xì)使用說明可以參考官方文檔碗誉。

Sophix框架:

阿里——未開源(商業(yè)收費(fèi))——實(shí)時(shí)修復(fù)+冷啟動(dòng)修復(fù)

介紹

Sophix的核心設(shè)計(jì)理念,就是非侵入性父晶。

我們的打包過程不會(huì)侵入到apk的build流程中哮缺。我們所需要的,只有已經(jīng)生成完畢的新舊apk甲喝,而至于apk是如何生成的——是Android Studio打包出來的尝苇、還是Eclipse打包出來的、或者是自定義的打包流程埠胖,我們一律不關(guān)心糠溜。在生成補(bǔ)丁的過程中間既不會(huì)改變?nèi)魏未虬M件,也不插入任何AOP代碼直撤,我們極力做到了——不添加任何超出開發(fā)者預(yù)期的代碼非竿,以避免多余的熱修復(fù)代碼給開發(fā)者帶來困擾。

在Sophix中谋竖,唯一需要的就是初始化和請(qǐng)求補(bǔ)丁兩行代碼红柱,甚至連入口Application類我們都不做任何修改,這樣就給了開發(fā)者最大的透明度和自由度圈盔。我們甚至重新開發(fā)了打包工具豹芯,使得補(bǔ)丁工具操作圖形界面化,這種所見即所得的補(bǔ)丁生成方式也是阿里熱修復(fù)獨(dú)家的驱敲。因此铁蹈,Sophix的接入成本也是目前市面上所有方案里最低的。

這種非侵入式熱更新理念众眨,是我們?cè)谠O(shè)計(jì)過程中從用戶使用角度進(jìn)行了深入思考而提煉出的核心思想握牧。

這里的用戶,指的自然是廣大的開發(fā)者娩梨。對(duì)于開發(fā)者而言沿腰,熱修復(fù)應(yīng)該是一個(gè)與業(yè)務(wù)無關(guān)的SDK組件,在整個(gè)開發(fā)過程中感知不到它的存在狈定。最理想的情況,就是開發(fā)者拿過來兩個(gè)apk纽什,一個(gè)是已經(jīng)安裝在手機(jī)上的apk措嵌,另一個(gè)是將要發(fā)布出去的apk芦缰。我們直接通過工具,就可以根據(jù)這兩個(gè)apk生成補(bǔ)丁让蕾,然后把這個(gè)補(bǔ)丁下發(fā)給已經(jīng)安裝的舊app上浪规,就可以直接加載或听,使舊app重生為新的app。而這個(gè)加載了補(bǔ)丁包新app笋婿,在功能和使用上誉裆,將會(huì)和直接安裝新apk別無二致。

至于Sophix這個(gè)名字缸濒,是來源于Sophic(明智的)+ FIX找御,一個(gè)更明智的熱修復(fù)方案。

使用

該框架商用绍填,每個(gè)賬號(hào)可以有免費(fèi)使用設(shè)備5萬。

簡(jiǎn)單分類

Native hook:

RocooFix栖疑,AndFix讨永,阿里百川HotFix

Java:

Qzone超級(jí)補(bǔ)丁,QFix遇革,Robust卿闹,Nuwa,RocooFix萝快,Aceso锻霎,Amigo,Tinker

混合:

Sophix

合理的分類

Native hook:

RocooFix揪漩,AndFix旋恼,阿里百川HotFix

Java multidex:

Qzone超級(jí)補(bǔ)丁,QFix奄容,Nuwa冰更,RocooFix

Java hook:

Robust,Aceso

Dex替換:

Amigo昂勒,Tinker

混合:

Sophix

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蜀细,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子戈盈,更是在濱河造成了極大的恐慌奠衔,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件塘娶,死亡現(xiàn)場(chǎng)離奇詭異归斤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)血柳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門官册,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人难捌,你說我怎么就攤上這事膝宁⊙荒眩” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵合蔽,是天一觀的道長(zhǎng)介返。 經(jīng)常有香客問我,道長(zhǎng)圣蝎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任徘公,我火速辦了婚禮,結(jié)果婚禮上坦袍,老公的妹妹穿的比我還像新娘等太。我一直安慰自己,他們只是感情好奠宜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布瞻想。 她就那樣靜靜地躺著,像睡著了一般榴都。 火紅的嫁衣襯著肌膚如雪漠其。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天拴驮,我揣著相機(jī)與錄音柴信,去河邊找鬼。 笑死潜沦,一個(gè)胖子當(dāng)著我的面吹牛萄涯,可吹牛的內(nèi)容都是我干的涝影。 我是一名探鬼主播争占,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼伯襟!你這毒婦竟也來了握童?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎英古,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體召调,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡唠叛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年沮稚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片障般。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挽荡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出即供,到底是詐尸還是另有隱情,我是刑警寧澤青自,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站性穿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏吗坚。R本人自食惡果不足惜呆万,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牡彻。 院中可真熱鬧出爹,春花似錦、人聲如沸严就。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铸董。三九已至,卻和暖如春蕴忆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背孽文。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工芋哭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人减牺。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓拔疚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親稚失。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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