調用流程
1、ZygoteInit的main方法
2、預加載常用類
3、讀取預加載類名時獲取BootClassLoader單例
4、調用classForName(C實現)獲取結果
構造函數
public DexClassLoader (String dexPath, String dexOutputDir, String libPath, ClassLoader parent)
optimizedDirectory是用來緩存我們需要加載的dex文件的,并創建一個DexFile對象,如果它為null,那么會直接使用dex文件原有的路徑來創建DexFile
DexClassLoader可以指定自己的optimizedDirectory,所以它可以加載外部的dex,因為這個dex會被復制到內部路徑的optimizedDirectory
注意:該加載器能夠加載未安裝的jar/apk/dex
構造函數
public PathClassLoader (String path, String libPath, ClassLoader parent)
調用流程
1、Zygote進程啟動SyetemServer進程
2、ZygoteInit的startSystemServer方法
3、Zygote進程通過forkSystemServer方法fork自身創建子進程并且調用handleSystemServerProcess
4、 工廠方法創建PathClassLoader
注意:該加載器只能加載系統中已經安裝過的apk
SecureClassLoader類和JDK8中的SecureClassLoader類的代碼是一樣的,它繼承了抽象類ClassLoader。SecureClassLoader并不是ClassLoader的實現類,而是拓展了ClassLoader類加入了權限方面的功能,加強了ClassLoader的安全性。
URLClassLoader類和JDK8中的URLClassLoader類的代碼是一樣的,它繼承自SecureClassLoader,用來通過URl路徑從jar文件和文件夾中加載類和資源。
InMemoryDexClassLoader是Android8.0新增的類加載器,繼承自BaseDexClassLoader,用于加載內存中的dex文件。
從已裝載過的類中找
如果從已裝載過的列表中找不到,則從父類裝載
如果父類找不到,從子類裝載
protected Class<> loadClass(String className, boolean resolve) throws ClassNotFoundException {
Class<> clazz = findLoadedClass(className);//從已裝載過的類中找。
if (clazz == null) { ClassNotFoundException suppressed = null; try { clazz = parent.loadClass(className, false);//由父類裝載 } catch (ClassNotFoundException e) { suppressed = e; } if (clazz == null) { try { clazz = findClass(className);//由子類裝載 } catch (ClassNotFoundException e) { e.addSuppressed(suppressed); throw e; } } } return clazz; }
public Class findClass(String name, List suppressed) {
for (Element element : dexElements) {//這里進行遍歷查詢
DexFile dex = element.dexFile;
if (dex != null) { //從DexFile中試圖加載Class,從這里看出,從第一個開始遍歷,如果查到就返回,這就是熱修復的基本原理。 Class clazz = dex.loadClassBinaryName(name, definingContext, suppressed); if (clazz != null) { return clazz; } } } //.. return null; }
另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。