前言
熱修復(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