安卓外掛程式化與熱修復的選型

2021-07-23 13:30:08 字數 1818 閱讀 9212

參考文章:

安卓外掛程式化的過去現在和未來 張濤

安卓外掛程式化從入門到放棄 包建強

安卓熱補丁動態框架小結 鴻洋

專訪羅迪:高二android大牛的成長之路

droidplugin的原理

安卓從三年前第乙個外掛程式化實現,到現在已經有很多種實現方法,主要目的為了減小模組耦合,方便在專案體量變大之後實現更好地團隊協作。

實現了分程序之後,外掛程式的崩潰也不會影響到主程序的使用。

androiddymnamicloader

使用activity作為外殼,裡面包含fragment,通過fragment管理activity的生命週期,是最早的外掛程式化方案。儘管比較古老,但在當時已經是先進的思路了。

dynamic-load-apk

cjframeforandroid

作者張濤。根據dl得到啟發,並在後續支援了service以及activity的launch mode。

android-pluginmgr

作者null,使用虛擬機器位元組碼的方式生成外掛程式類的子類。首次部署效率較低,後面速度快得多。

雖然有效率問題,但是此種方式的外掛程式**不必遵循任何限定。

不過作者現在已經改變實現方式,通過instrument來進行載入。

direct-load-api

簡稱dla,作者lody,當時是乙個中學生。也是**的方式,只不過把外掛程式activity偽裝成呼叫者的樣子(通過反射修改改外掛程式activity的部分成員變數為呼叫者的變數)。

這種實現也不需要遵循任何限定,也可以自由地使用外掛程式中的資源,也不需要在主調(宿主)模組中宣告activity,當時還不支援activity以外的元件。

後續,作者也在研究虛擬機器掛鉤的方式來實現外掛程式化。在專案中看到的使用較少,坑量不明確。

droidplugin

openatlas

來自**團隊,也是比較靠譜的框架,暫時還沒看透,後面慢慢看,易用**覺不如droidplugin。

熱修復的主要應用場景則是讓使用者無感知地修復線上問題,防止遇到問題後各部門措手不及。

熱修復和外掛程式化的根本都是利用classloader來載入apk和dex,不同的是外掛程式化大多載入的是apk,其中攜帶資源,而熱修復主要用於修復**,不包含資源,修復的單位也大多以dex為主,dex盡量小。

雖然根本都是利用classloader,但是想用乙個框架搞定兩個功能還是不太現實的,雖然外掛程式化或熱修復也可以實現對方的部分需求,但是因為具體流派的原因,所使用的技術還是不同的,要分開處理。

市面上常見的熱修復框架包括:

andfix(阿里)

exposed(阿里)

nuwa(實現類似於qq空間)

其中前兩中實現方式是通過把方法重定向到native方法,來實現在呼叫方法的前中後對方法進行修改和替換。前兩種的缺點是重定向native後相容性和適配性變差。

nuwa根據dexclassloader中的dexpathlist的載入順序,將補丁的方法優先載入。這種方法會遇到報錯。在dalvik虛擬機器情況下,可以使用插樁的方式解決,參考鏈結資料。art虛擬機器的環境下,還沒有看。這種方式的插樁帶來了一定的效能損耗。

幾種框架對比:

鑑於每乙個成熟的框架都有大量的適配工作,基於穩定性考慮最後初步選型:

外掛程式化:droidplugin

熱修復:tinker

安卓熱修復之 大蒐集

android dex分包方案 開源中國 原理分析 android 熱補丁動態修復框架小結 鴻洋 android熱更新實現原理 大頭鬼bruce 熱修復庫 dodola 寒江不釣 bunnyblue from android 熱補丁和熱修復 參考 各大熱補丁方案分析和比較 xposed 專案描述 x...

熱修復和外掛程式化

某個特定的類載入器在接到載入類的請求時,首先將載入任務委託給父類載入器,依次遞迴,如果父類載入器可以完成類載入任務,就成功返回 只有父類載入器無法完成此載入任務時,才自己去載入。保證了只載入一次 乙個classloader可以包含多個dex檔案,每個dex檔案是乙個element,多個dex檔案排列...

外掛程式化與熱更新

外掛程式化步驟 主apk分析 dex靠pathclassloader載入 以及xml資源靠resource載入 實現 建立dexclassloader載入外掛程式 建立resource載入資源檔案 管理外掛程式activity生命週期 外掛程式化基礎 反射 總結一句話 反射可以讓程式設計師拋開 的限...