熱修復和外掛程式化

2021-09-11 12:20:14 字數 2315 閱讀 8081

某個特定的類載入器在接到載入類的請求時,首先將載入任務委託給父類載入器,依次遞迴,如果父類載入器可以完成類載入任務,就成功返回;只有父類載入器無法完成此載入任務時,才自己去載入。保證了只載入一次

乙個classloader可以包含多個dex檔案,每個dex檔案是乙個element,多個dex檔案排列成乙個有序的陣列dexelements,當找類的時候,會按順序遍歷dex檔案,然後從當前遍歷的dex檔案中找類,如果找類則返回,如果找不到從下乙個dex檔案繼續查詢

basedexclassloader 中有個 pathlist 物件,pathlist 中包含乙個 dexfile 的集合 dexelements,而對於類載入呢, 就是遍歷這個集合,通過dexfile去尋找,(其實尋找類無非就是根據name全限定名來載入的),我們可以利用反射 看下basedexclassloader原始碼

//所有的

private final dexpathlist pathlist;

@override

protected class<?> findclass(string name) throws classnotfoundexception

return clazz;

} #dexpathlist

public class findclass(string name)

} }

return null;

}複製**

利用反射把咱們的dex或者是jar或者是apk裡面的 dexelements 插入到原有的之前,就是利用反射 把 外掛程式的dexelements+以前的dexelements 重新賦值給 pathlist

private void inject(string path)  catch (classnotfoundexception e)  catch (illegalacces***ception e)  catch (nosuchfieldexception e) 

}複製**

@override

protected void attachbasecontext(context base)

複製**

2.2.1 任玉剛想法

找到需要hook方法的系統類

利用**模式來**系統類的執行攔截我們需要攔截的方法

也就是**acitivty **activity中去反射apk中activity的所有生命週期的方法,然後將activity的生命週期和**activity的生命週期進行同步

使用反射的方法把這個系統類替換成你的**類

2.2.2 virtualapk

找到需要hook方法的系統類

dexclassloader

提前佔坑(欺上瞞下) virtualapk庫中的清單檔案中有很多activity,1個service 乙個廣播

廣播是 動態轉靜態

2.3 開始簡單擼**地代表一下

寫乙個hooker類 讓他去hook instrumentation類 或者是 activitymanagerproxy 下面hook的是 instrumentation類

public class hooker 

}複製**

寫乙個hookinstrumentation 繼承 instrumentation 這個只是簡單的把開啟com.nzy.myeventbus.mainactivity的activity 換成了com.nzy.myeventbus.threeactivity public class myinstrumentation extends instrumentation

@override

public activity newactivity(classloader cl, string classname, intent intent) throws instantiationexception, illegalacces***ception, classnotfoundexception

return super.newactivity(cl,classname , intent);

}}複製**

注意 :這只是hook了newactivity方法 這個方法可以重寫,但是instrumentation中像execstartactivity是隱藏的不能被重寫, 可以在myinstrumentation 完全按照 instrumentation 中 execstartactivity方法寫,改改我們自己的要改的**

try  catch (exception e) 

複製**

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

參考文章 安卓外掛程式化的過去現在和未來 張濤 安卓外掛程式化從入門到放棄 包建強 安卓熱補丁動態框架小結 鴻洋 專訪羅迪 高二android大牛的成長之路 droidplugin的原理 安卓從三年前第乙個外掛程式化實現,到現在已經有很多種實現方法,主要目的為了減小模組耦合,方便在專案體量變大之後實...

元件化開發,外掛程式化開發和熱修復

外掛程式化開發和熱修復 所以外掛程式化比熱修復簡單,熱修復是在外掛程式化的基礎上在進行替舊的bug類 android元件化和外掛程式化開發 外掛程式化是在 執行時 而元件化是在 編譯時 換句話說,外掛程式化是基於多 apk 的,而元件化本質上還是只有乙個 apk。droidplugin small ...

外掛程式化與熱更新

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