精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

了解 Android 類加載器的工作原理,DexPathList 在類加載過程中的作用

移動開發(fā)
Android的類加載器系統(tǒng)基于JVM的類加載器模型,但有一些特定的調整和優(yōu)化,以適應Android平臺的需要。

類加載器

在Android中,類加載器(ClassLoader)是一個重要的組件,負責在運行時動態(tài)加載JVM和Android類庫。Android的類加載器系統(tǒng)基于JVM的類加載器模型,但有一些特定的調整和優(yōu)化,以適應Android平臺的需要。

(1) Bootstrap ClassLoader:

  • 這是最頂層的類加載器,由JVM實現(xiàn)。
  • 主要加載Java和Android核心類庫。
  • 通常通過null作為父加載器。

(2) PathClassLoader(或DexClassLoader):

  • Android特有的類加載器,用于從APK文件、DEX文件或JAR/ZIP文件中加載類。
  • PathClassLoader是Android應用默認的類加載器,用于加載應用的類和資源。

DexClassLoader是PathClassLoader的一個子類,提供了從指定的路徑加載DEX文件的能力,動態(tài)加載插件或模塊化場景常用加載器。

//DexClassLoader.java
package dalvik.system;

public class DexClassLoader extends BaseDexClassLoader {
    public DexClassLoader(String dexPath, String optimizedDirectory,
            String libraryPath, ClassLoader parent) {
        super(dexPath, new File(optimizedDirectory), libraryPath, parent);
    }
    
    public DexClassLoader(String dexPath, String optimizedDirectory,
            String librarySearchPath, ClassLoader parent) {
        super(dexPath, null, librarySearchPath, parent);
    }
}

//PathClassLoader
package dalvik.system;

public class PathClassLoader extends BaseDexClassLoader {

   public PathClassLoader(String dexPath, ClassLoader parent) {
        super(dexPath, null, null, parent);
    }
    
    public PathClassLoader(String dexPath, String librarySearchPath, ClassLoader parent) {
        super(dexPath, null, librarySearchPath, parent);
    }
}

可以發(fā)現(xiàn)PathClassLoader和DexClassLoader源碼很簡單,只包含了一個構造函數(shù),去調用父類BaseDexClassLoader(所有的工作都應該是在BaseDexClassLoader里完成的了)。而這兩個加載器不同的是PathClassLoader的構造中少了optimizedDirectory這個參數(shù),原因是PathClassLoader是加載/data/app中的apk,也就是系統(tǒng)中的apk,而這部分的apk都會解壓釋放dex到指定的目錄中,這個操作由系統(tǒng)完成,不需要單獨傳入路徑,而DexClassLoader傳入,用來緩存需要加載的dex文件,并創(chuàng)建一個DexFile對象,如果為null,會直接使用dex文件原有路徑創(chuàng)建DexFile(這個參數(shù)已經棄用,自API26起無效)。

(3) System ClassLoader(或AppClassLoader):

  • Android系統(tǒng)的應用類加載器,繼承自URLClassLoader。
  • 用于加載Android系統(tǒng)的類和應用的類。
  • 在Android中不直接引用System ClassLoader或AppClassLoader,通過ClassLoader.getSystemClassLoader()獲取。

(4) 自定義ClassLoader:

  • 可以繼承ClassLoader類或其子類(如DexClassLoader)來創(chuàng)建自定義的類加載器。
  • 自定義類加載器可以用于加載網絡上的類、從數(shù)據庫加載加密的類、或者實現(xiàn)更復雜的類加載邏輯。

類加載器的主要用途:

  • 動態(tài)加載和執(zhí)行代碼,如插件化開發(fā)、熱更新等。
  • 加載和執(zhí)行不同來源的代碼,如從網絡下載的JAR包或DEX文件。
  • 隔離不同來源的代碼,防止類沖突和安全問題。

注意:濫用類加載器可能導致內存泄漏和性能問題。在使用類加載器時,應該仔細考慮其生命周期和資源管理。

DexPathList

DexPathList是DexClassLoader和BaseDexClassLoader等類加載器用于處理DEX文件路徑的一個內部類。當使用DexClassLoader或BaseDexClassLoader加載DEX文件時,DexPathList起到了關鍵的作用。

(1) 作用:DexPathList負責管理和維護DEX文件的路徑信息,使類加載器能夠正確地找到并加載DEX文件中的類。

(2) 構造:DexPathList在DexClassLoader或BaseDexClassLoader的構造函數(shù)中被創(chuàng)建。構造DexPathList時,需要提供DEX文件的路徑、優(yōu)化目錄、庫路徑以及父類加載器等參數(shù)。

public class BaseDexClassLoader extends ClassLoader {

    private final DexPathList pathList;
    
    public BaseDexClassLoader(String dexPath, File optimizedDirectory,
            String librarySearchPath, ClassLoader parent) {
        super(parent);
        this.pathList = new DexPathList(this, dexPath, librarySearchPath, optimizedDirectory);
    }
    
    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        List<Throwable> suppressedExceptions = new ArrayList<Throwable>();
        Class c = pathList.findClass(name, suppressedExceptions);
        if (c == null) {
            ClassNotFoundException cnfe = new ClassNotFoundException("Didn't find class \"" + name + "\" on path: " + pathList);
            for (Throwable t : suppressedExceptions) {
                cnfe.addSuppressed(t);
            }
            throw cnfe;
        }
        return c;
    }
}

(3) 成員變量:DexPathList有一個私有的final成員變量dexElements,是一個Element數(shù)組,包含了所有DEX文件的Element對象,每個Element對象對應一個DEX文件。

private final Element[] dexElements;

public DexPathList(ClassLoader definingContext, String dexPath,
        String libraryPath, File optimizedDirectory) {
    ...
    this.definingContext = definingContext;
    this.dexElements = makeDexElements(splitDexPath(dexPath), optimizedDirectory,suppressedExceptions);
    ...
}

(4) 加載DEX文件:在DexPathList的構造函數(shù)中,會調用makeDexElements()方法來加載DEX文件。這個方法會遍歷提供的DEX文件路徑列表,并為每個DEX文件創(chuàng)建一個Element對象,然后將這些Element對象添加到dexElements數(shù)組中。

private static Element[] makeDexElements(ArrayList<File> files, File optimizedDirectory, ArrayList<IOException> suppressedExceptions) {
    // 1.創(chuàng)建Element集合
    ArrayList<Element> elements = new ArrayList<Element>();
    // 2.遍歷所有dex文件(也可能是jar、apk或zip文件)
    for (File file : files) {
        ZipFile zip = null;
        DexFile dex = null;
        String name = file.getName();
        ...
        // 如果是dex文件
        if (name.endsWith(DEX_SUFFIX)) {
            dex = loadDexFile(file, optimizedDirectory);

        // 如果是apk、jar、zip文件(這部分在不同的Android版本中,處理方式有細微差別)
        } else {
            zip = file;
            dex = loadDexFile(file, optimizedDirectory);
        }
        ...
        // 3.將dex文件或壓縮文件包裝成Element對象,并添加到Element集合中
        if ((zip != null) || (dex != null)) {
            elements.add(new Element(file, false, zip, dex));
        }
    }
    // 4.將Element集合轉成Element數(shù)組返回
    return elements.toArray(new Element[elements.size()]);
}

(5) 加載類:當類加載器需要加載一個類時,會通過DexPathList的loadClass()方法來實現(xiàn)。這個方法會遍歷dexElements數(shù)組中的每個Element對象,并嘗試從對應的DEX文件中加載類。一旦找到需要加載的類,就會返回該類的Class對象。

public Class findClass(String name, List<Throwable> suppressed) {
    for (Element element : dexElements) {
        // 遍歷出一個dex文件
        DexFile dex = element.dexFile;

        if (dex != null) {
            // 在dex文件中查找類名與name相同的類
            Class clazz = dex.loadClassBinaryName(name, definingContext, suppressed);
            if (clazz != null) {
                return clazz;
            }
        }
    }
    if (dexElementsSuppressedExceptions != null) {
        suppressed.addAll(Arrays.asList(dexElementsSuppressedExceptions));
    }
    return null;
}

(6) 優(yōu)化:為了提高性能,DexPathList還支持DEX文件的優(yōu)化。在加載DEX文件時,可以將DEX文件優(yōu)化到指定的目錄中,以減少內存占用和提高加載速度。

責任編輯:趙寧寧 來源: 沐雨花飛蝶
相關推薦

2025-06-26 03:33:00

2012-02-14 13:39:57

Java

2012-02-09 10:31:17

Java

2021-07-05 06:51:43

Java機制類加載器

2025-07-01 07:41:37

Java類加載器雙親委派

2024-03-12 07:44:53

JVM雙親委托機制類加載器

2019-12-09 15:08:30

JavaTomcatWeb

2024-12-04 09:01:55

引導類加載器C++

2024-03-08 08:26:25

類的加載Class文件Java

2012-11-06 10:19:18

Java自定義加載Java類

2010-03-16 14:58:15

Java類加載器

2023-05-10 11:07:18

2021-01-06 09:01:05

javaclass

2024-12-02 09:01:23

Java虛擬機內存

2009-08-24 11:36:27

CLR加載過程

2024-04-09 08:41:41

JVM類加載Java

2024-09-06 09:37:45

WebApp類加載器Web 應用

2019-07-24 08:34:35

Java對象數(shù)據結構

2009-02-03 09:42:53

JAVA類JVM指令forName方法

2021-07-28 10:08:19

類加載代碼塊面試
點贊
收藏

51CTO技術棧公眾號

国产亚洲精品一区二区| 亚洲黄色小说网站| 国产精品久久久久久亚洲调教 | 93久久精品日日躁夜夜躁欧美 | 电影在线观看一区二区| 1000精品久久久久久久久| 欧美在线视频一二三| 少妇太紧太爽又黄又硬又爽小说| 日韩欧美三区| 午夜电影网亚洲视频| 日韩资源av在线| 性少妇videosexfreexxx片| 99精品免费网| www.欧美三级电影.com| 大尺度做爰床戏呻吟舒畅| 成人香蕉视频| 亚洲综合自拍偷拍| 亚洲va韩国va欧美va精四季| 韩国av在线免费观看| 日韩不卡一区二区| 韩国精品久久久999| 国产三级aaa| 欧美自拍视频| 日韩一区二区电影| 亚洲黄色a v| av男人的天堂在线观看| 中文字幕一区二区三区蜜月| 久久综合给合久久狠狠色| 国产精品久久免费| 日韩—二三区免费观看av| 国内精品久久久久影院优| 波多野结衣喷潮| 久久99国内| 亚洲国产第一页| 一级网站在线观看| 天堂资源在线| 亚洲国产aⅴ天堂久久| 特色特色大片在线| 日本在线免费网| 国产欧美一区二区三区在线看蜜臀 | 亚洲免费一在线| 国产精久久久久| 国产精久久久| 在线视频综合导航| 成人一级片网站| 国产三级电影在线播放| 一区二区三区四区在线| 潘金莲一级淫片aaaaa免费看| 国产福利在线视频| 国产调教视频一区| 日本一区免费| 国产视频精品久久| 国产日韩欧美不卡| 日韩高清国产精品| 岛国在线视频| 日本一二三不卡| 亚洲高清精品中出| 一本一道波多野毛片中文在线| 国产视频视频一区| 日韩久久在线| 91美女视频在线| 国产aⅴ综合色| 成人资源av| 丰满人妻一区二区三区四区53| 国产盗摄视频一区二区三区| av一本久道久久波多野结衣| 亚洲国产精品久久久久爰性色| 国产寡妇亲子伦一区二区| 亚洲综合第一页| 亚洲av无码国产精品永久一区| 国产成人av电影| 国产精品视频入口| 亚洲av成人精品一区二区三区在线播放| caoporm超碰国产精品| 国产欧美最新羞羞视频在线观看| 91免费视频播放| 国产成人av影院| 美女黄毛**国产精品啪啪| 国产片在线观看| 日韩毛片精品高清免费| 久久这里只有精品18| 亚洲人成在线网站| 精品视频一区三区九区| 小日子的在线观看免费第8集| xxxxxhd亚洲人hd| 亚洲欧洲一区二区三区在线观看 | 偷拍日韩校园综合在线| 欧美精品aaaa| 国产一区二区三区免费观看在线| 亚洲成年人在线播放| 巨胸大乳www视频免费观看| 日韩国产欧美一区二区| 欧美另类69精品久久久久9999| av大片免费观看| 久久99蜜桃精品| 国产一区精品视频| 在线免费观看黄色| 性欧美大战久久久久久久久| 亚洲黄色a v| 国产精品三p一区二区| 国产亚洲精品久久久| 在线观看亚洲大片短视频| 欧美黄色一区二区| 国产精品扒开腿做爽爽爽的视频| 国产成人麻豆精品午夜在线| 久久在线免费观看| 99re6这里有精品热视频| 625成人欧美午夜电影| 欧美老人xxxx18| 扒开jk护士狂揉免费| 亚洲成人精选| 国产精品久久久久国产a级| 亚洲va天堂va欧美ⅴa在线| 久久女同互慰一区二区三区| 日本免费成人网| 777午夜精品电影免费看| 亚洲韩国日本中文字幕| 三级av在线免费观看| 久久午夜av| 国产一区二区三区奇米久涩| 黄av在线播放| 欧美在线影院一区二区| 黄色av电影网站| 影音先锋日韩在线| 国产欧美精品xxxx另类| 九色视频在线观看免费播放| 亚洲成av人片| 中文字幕第10页| 欧美电影三区| 国产精品久久久久久久9999| 亚洲av成人无码久久精品老人| 亚洲一区在线播放| 人妻换人妻仑乱| 91视频一区| 国产精品都在这里| 看电影就来5566av视频在线播放| 偷拍日韩校园综合在线| 美女黄色一级视频| 国产中文一区| 91最新在线免费观看| 麻豆传媒在线观看| 欧美日韩专区在线| 日本人亚洲人jjzzjjz| 麻豆久久婷婷| 日本视频一区二区不卡| 26uuu亚洲电影在线观看| 6080国产精品一区二区| 国产中文av在线| 精品一区二区三区免费| 一区二区视频国产| 制服丝袜在线一区| 免费成人你懂的| 亚洲一区二区三区欧美| 成人国产激情| 中文字幕在线日韩| 91在线视频国产| 亚洲人午夜精品天堂一二香蕉| 亚洲一区二区福利视频| 91精品蜜臀一区二区三区在线| 成人一区二区电影| 高潮一区二区三区乱码| 成人久久电影| 欧美中文在线视频| 狠狠色伊人亚洲综合网站l | 日本三级网站在线观看| 免费成人你懂的| 日本美女爱爱视频| 粉嫩av一区二区| 欧美一区三区三区高中清蜜桃| 国产精品一区二区不卡视频| 国产精品久久久午夜夜伦鲁鲁| 国产成人av影院| 免费在线黄网站| 在线成人视屏| 久久在线视频在线| 欧美一区二区三区成人精品| 久热re这里精品视频在线6| 欧美日韩在线精品| 国产乱码在线| 国产一区二区三区视频| 91欧美日韩麻豆精品| 亚洲五月六月丁香激情| 亚洲专区区免费| 久久99久国产精品黄毛片色诱| 8x8ⅹ国产精品一区二区二区| 国偷自产av一区二区三区| 日日嗨av一区二区三区四区| 久久久久久久国产精品视频| 欧洲伦理片一区 二区 三区| 欧美美女网站色| 精品肉丝脚一区二区三区| 久久一区二区三区四区| 涩多多在线观看| 国产欧美激情| 性生活免费观看视频| 日韩欧美ww| 国产啪精品视频网站| 麻豆福利在线观看| 欧美日韩大陆一区二区| 欧美成欧美va| 国产女同性恋一区二区| 青青草精品视频在线观看| 91精品亚洲| 精品中文字幕一区| 精品三级国产| 国产www精品| 自拍视频在线播放| 日韩成人网免费视频| 99国产精品久久久久久久成人| 色综合激情久久| 四虎成人精品永久免费av| 国产美女av在线| 欧美日韩另类视频| 美国精品一区二区| 91麻豆123| 任你躁av一区二区三区| 午夜亚洲性色福利视频| 91夜夜未满十八勿入爽爽影院| 免费国产在线观看| 欧美一区中文字幕| 日本在线观看中文字幕| 一区二区三区免费在线观看| 黄色国产在线观看| 欧美激情aⅴ一区二区三区| 亚洲视频电影| 国产一区不卡| 蜜桃网站成人| 免费福利视频一区| 99精品国产高清一区二区| 性高爱久久久久久久久| 欧美中文字幕在线视频| 色黄网站在线观看| 欧美大尺度激情区在线播放| 免费看日b视频| 国产美女永久免费无遮挡| 亚洲精品午夜国产va久久成人| 国产黄a三级三级| 亚洲天堂成人av| 天堂а√在线中文在线| 日韩性xxx| 2019中文字幕全在线观看| 在线中文字幕-区二区三区四区| 在线看日韩欧美| av在线收看| 在线视频免费一区二区| av资源在线观看免费高清| 中文国产成人精品| 1769视频在线播放免费观看| 中文字幕亚洲国产| 淫片在线观看| 波霸ol色综合久久| 岛国中文字幕在线| 欧美精品一二区| 免费电影视频在线看| 欧美激情精品久久久| av在线播放资源| 日本成人免费在线| av在线日韩| 国产日韩精品在线| 欧美在线在线| 国产伦理久久久| 亚洲免费福利一区| 亚洲精品日韩精品| 91精品综合| 国产亚洲精品久久久久久久| 在线精品在线| 日韩免费毛片视频| 久久超级碰视频| 亚洲熟妇一区二区| 成人avav在线| 免费网站在线高清观看| 中文字幕一区二区在线播放| 免费看一级一片| 色婷婷综合久久久久中文| 在线观看国产黄| 欧美xxx久久| 男人久久精品| 久久久极品av| 成人黄色动漫| 国产精选久久久久久| 亚洲欧美日本国产| 欧美成人第一区| 91九色精品国产一区二区| 免费看欧美黑人毛片| 久久99伊人| 亚洲高清av一区二区三区| 播五月开心婷婷综合| 潮喷失禁大喷水aⅴ无码| 有坂深雪av一区二区精品| 久久99国产综合精品免费| 欧美日韩国产三级| 无码国产伦一区二区三区视频| 中文字幕日本欧美| 91超碰在线播放| 国产欧美精品va在线观看| 琪琪久久久久日韩精品| 亚洲国产午夜伦理片大全在线观看网站| 综合视频在线| 亚洲视频在线观看一区二区三区| 国产电影精品久久禁18| 香蕉久久久久久久| 精品久久香蕉国产线看观看亚洲 | 黄色的网站在线观看| 欧美在线性爱视频| 伊人久久噜噜噜躁狠狠躁| 色噜噜狠狠色综合网| 9久re热视频在线精品| 久草青青在线观看| 成人在线视频首页| 99久久99久久精品国产| 高潮白浆女日韩av免费看| av在线亚洲天堂| 中文字幕一精品亚洲无线一区 | 国产精品theporn88| 成人一区不卡| 欧美成人精品欧美一级乱| 国产乱码一区二区三区| 成人性生交大片免费看无遮挡aⅴ| 亚洲大片免费看| 国产黄色美女视频| 日韩中文字幕亚洲| 88xx成人网| 欧美日韩无遮挡| 国产精品社区| 国产一级黄色录像| 亚洲国产精品综合小说图片区| 999av视频| 久久精品99久久久久久久久| 视频精品导航| 日韩av高清在线播放| 久久精品一区二区国产| 三级电影在线看| 欧美日韩国产麻豆| 凸凹人妻人人澡人人添| 国语自产精品视频在线看| 美国十次综合久久| 日韩精品第1页| 国产一区二区三区免费观看| 人人艹在线视频| 欧美美女网站色| 免费黄色电影在线观看| 91精品久久久久久久久久久久久| 日韩精品二区| 孩娇小videos精品| 国产精品第一页第二页第三页| 中文字幕理论片| 中文字幕亚洲在线| 亚洲一区二区三区久久久| 伊人久久婷婷色综合98网| 精品一区二区精品| 国产女人被狂躁到高潮小说| 日韩欧美一二三四区| 国内老司机av在线| 精品一区日韩成人| 先锋a资源在线看亚洲| 日韩一区二区a片免费观看| 欧洲精品在线观看| 老司机午夜在线视频| 91久久国产精品| 影音先锋中文字幕一区| 精品人妻一区二区三区日产| 欧美性高潮床叫视频 | 久久中国妇女中文字幕| 久久久久亚洲精品中文字幕| 国产曰肥老太婆无遮挡| 91一区在线观看| 中文字幕在线观看第二页| 久久精品夜夜夜夜夜久久| 欧美.com| 黄色动漫网站入口| 国产女人18毛片水真多成人如厕 | 日韩在线观看精品| 秋霞一区二区| 国产乱子夫妻xx黑人xyx真爽| 国产女主播视频一区二区| 99精品久久久久久中文字幕| 久久久久久久影院| 久久99免费视频| 99国产精品久久久久久| 午夜视频一区在线观看| 在线免费av网站| 国产精品一区二区三区四区五区 | free性中国hd国语露脸| 欧美日韩在线播放一区| 污污网站在线看| 日韩高清国产精品| 国产a久久麻豆| 中文字幕乱码人妻无码久久| 性欧美xxxx交| 久久视频国产| 亚洲蜜桃精久久久久久久久久久久 | 妞干网这里只有精品| 久久日一线二线三线suv| 国产激情视频在线播放| 日韩av电影在线网| 欧美精品99| 免费黄色片网站| 亚洲精品国产综合区久久久久久久| 久久精品国产福利| 国产精品va无码一区二区|