溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android 類加載模式

發(fā)布時間:2020-07-08 22:50:14 來源:網絡 閱讀:963 作者:星恒Android 欄目:移動開發(fā)

類圖

 Android 類加載模式

相關類介紹

BootClassLoader

調用流程
1、ZygoteInit的main方法
2、預加載常用類
3、讀取預加載類名時獲取BootClassLoader單例
4、調用classForName(C實現(xiàn))獲取結果

DexClassLoader

構造函數
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

PathClassLoader

構造函數
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和URLClassLoader

SecureClassLoader類和JDK8中的SecureClassLoader類的代碼是一樣的,它繼承了抽象類ClassLoader。SecureClassLoader并不是ClassLoader的實現(xiàn)類,而是拓展了ClassLoader類加入了權限方面的功能,加強了ClassLoader的安全性。
URLClassLoader類和JDK8中的URLClassLoader類的代碼是一樣的,它繼承自SecureClassLoader,用來通過URl路徑從jar文件和文件夾中加載類和資源。

InMemoryDexClassLoader

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;
    }
向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI