某個特定的類載入器在接到載入類的請求時,首先將載入任務委託給父類載入器,依次遞迴,如果父類載入器可以完成類載入任務,就成功返回;只有父類載入器無法完成此載入任務時,才自己去載入。保證了只載入一次
乙個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生命週期 外掛程式化基礎 反射 總結一句話 反射可以讓程式設計師拋開 的限...