您好,登錄后才能下訂單哦!
調用流程
1、ZygoteInit的main方法
2、預加載常用類
3、讀取預加載類名時獲取BootClassLoader單例
4、調用classForName(C實現(xiàn))獲取結果
構造函數
public DexClassLoader (String dexPath, String dexOutputDir, String libPath, ClassLoader parent)
optimizedDirectory是用來緩存我們需要加載的dex文件的,并創(chuàng)建一個DexFile對象,如果它為null,那么會直接使用dex文件原有的路徑來創(chuàng)建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自身創(chuàng)建子進程并且調用handleSystemServerProcess
4、 工廠方法創(chuàng)建PathClassLoader
注意:該加載器只能加載系統(tǒng)中已經安裝過的apk
SecureClassLoader類和JDK8中的SecureClassLoader類的代碼是一樣的,它繼承了抽象類ClassLoader。SecureClassLoader并不是ClassLoader的實現(xiàn)類,而是拓展了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; }
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。