創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)整合營(yíng)銷(xiāo)推廣、網(wǎng)站重做改版、滁州網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁(yè)面制作、成都做商城網(wǎng)站、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為滁州等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
調(diào)用流程
1、ZygoteInit的main方法
2、預(yù)加載常用類(lèi)
3、讀取預(yù)加載類(lèi)名時(shí)獲取BootClassLoader單例
4、調(diào)用classForName(C實(shí)現(xiàn))獲取結(jié)果
構(gòu)造函數(shù)
public DexClassLoader (String dexPath, String dexOutputDir, String libPath, ClassLoader parent)
optimizedDirectory是用來(lái)緩存我們需要加載的dex文件的,并創(chuàng)建一個(gè)DexFile對(duì)象,如果它為null,那么會(huì)直接使用dex文件原有的路徑來(lái)創(chuàng)建DexFile
DexClassLoader可以指定自己的optimizedDirectory,所以它可以加載外部的dex,因?yàn)檫@個(gè)dex會(huì)被復(fù)制到內(nèi)部路徑的optimizedDirectory
注意:該加載器能夠加載未安裝的jar/apk/dex
構(gòu)造函數(shù)
public PathClassLoader (String path, String libPath, ClassLoader parent)
調(diào)用流程
1、Zygote進(jìn)程啟動(dòng)SyetemServer進(jìn)程
2、ZygoteInit的startSystemServer方法
3、Zygote進(jìn)程通過(guò)forkSystemServer方法fork自身創(chuàng)建子進(jìn)程并且調(diào)用handleSystemServerProcess
4、 工廠方法創(chuàng)建PathClassLoader
注意:該加載器只能加載系統(tǒng)中已經(jīng)安裝過(guò)的apk
SecureClassLoader類(lèi)和JDK8中的SecureClassLoader類(lèi)的代碼是一樣的,它繼承了抽象類(lèi)ClassLoader。SecureClassLoader并不是ClassLoader的實(shí)現(xiàn)類(lèi),而是拓展了ClassLoader類(lèi)加入了權(quán)限方面的功能,加強(qiáng)了ClassLoader的安全性。
URLClassLoader類(lèi)和JDK8中的URLClassLoader類(lèi)的代碼是一樣的,它繼承自SecureClassLoader,用來(lái)通過(guò)URl路徑從jar文件和文件夾中加載類(lèi)和資源。
InMemoryDexClassLoader是Android8.0新增的類(lèi)加載器,繼承自BaseDexClassLoader,用于加載內(nèi)存中的dex文件。
從已裝載過(guò)的類(lèi)中找
如果從已裝載過(guò)的列表中找不到,則從父類(lèi)裝載
如果父類(lèi)找不到,從子類(lèi)裝載
protected Class<> loadClass(String className, boolean resolve) throws ClassNotFoundException {
Class<> clazz = findLoadedClass(className);//從已裝載過(guò)的類(lèi)中找。
if (clazz == null) { ClassNotFoundException suppressed = null; try { clazz = parent.loadClass(className, false);//由父類(lèi)裝載 } catch (ClassNotFoundException e) { suppressed = e; } if (clazz == null) { try { clazz = findClass(className);//由子類(lèi)裝載 } catch (ClassNotFoundException e) { e.addSuppressed(suppressed); throw e; } } } return clazz; }
public Class findClass(String name, List suppressed) {
for (Element element : dexElements) {//這里進(jìn)行遍歷查詢
DexFile dex = element.dexFile;
if (dex != null) { //從DexFile中試圖加載Class,從這里看出,從第一個(gè)開(kāi)始遍歷,如果查到就返回,這就是熱修復(fù)的基本原理。 Class clazz = dex.loadClassBinaryName(name, definingContext, suppressed); if (clazz != null) { return clazz; } } } //.. return null; }
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。