日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 逆向】类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )

發布時間:2025/6/17 Android 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 逆向】类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、ClassLoader 源碼簡介
  • 二、BaseDexClassLoader 源碼簡介
  • 三、DexClassLoader 源碼簡介
  • 四、PathClassLoader 源碼簡介
  • 五、InMemoryDexClassLoader 源碼簡介





一、ClassLoader 源碼簡介



ClassLoader 抽象類中的 private final ClassLoader parent 成員 , 用于實現雙親委派機制 , 所有的 ClassLoader 子類 , 如 PathClassLoader , DexClassLoader 等類加載器 , 都會存在一個 ClassLoader parent 成員 , 用于表示該 類加載器 的父節點 是哪個 類加載器 ;

BootClassLoader 的 ClassLoader parent 成員是空的 , 是最頂層的類加載器 ;

注意該 ClassLoader parent 成員是 final 修飾的 , 只能進行一次賦值 ;


ClassLoader 源碼參考 :

public abstract class ClassLoader {// 委托的父類加載器// 注意:VM硬編碼此字段的偏移量,因此所有新字段// 必須在*之后添加*。private final ClassLoader parent;}

源碼路徑 : /libcore/ojluni/src/main/java/java/lang/ClassLoader.java





二、BaseDexClassLoader 源碼簡介



BaseDexClassLoader 中實現了類加載的核心業務邏輯 , 這個類很大 , 很復雜 ;


BaseDexClassLoader 源碼 :

/*** 用于各種基于dex的數據庫之間的通用功能的基類* {@link ClassLoader} 實現.*/public class BaseDexClassLoader extends ClassLoader {}

源碼路徑 : /libcore/dalvik/src/main/java/dalvik/system/BaseDexClassLoader.java





三、DexClassLoader 源碼簡介



DexClassLoader 繼承了 BaseDexClassLoader 類 , 類中沒有實現任何業務邏輯 , 只是提供了一個構造函數 ;


DexClassLoader 源碼 :

/*** 從{@code.jar}和{@code.apk}文件加載類的類加載器* 包含{@code classes.dex}項。這可用于執行未作為應用程序一部分安裝的代碼。** <p>這個類加載器需要一個應用程序私有的可寫目錄來緩存優化的類。* 使用{@code Context.getCodeCacheDir()}創建* 這樣一個目錄:<pre>{@code* File dexOutputDir = context.getCodeCacheDir();* }</pre>** <p><strong>不要在外部存儲上緩存優化的類。</strong>* 外部存儲不提供保護您的計算機所需的訪問控制* 防止代碼注入攻擊的應用程序。*/ public class DexClassLoader extends BaseDexClassLoader {/*** 創建一個{@code-DexClassLoader}來查找解釋的和本機的* 密碼解釋類可以在包含的一組DEX文件中找到* 在Jar或APK文件中。** <p>使用指定的字符分隔路徑列表* {@code path.separator}系統屬性,默認為{@code:}。** @param dexPath 包含類和* 資源,由{@code File.pathSeparator}分隔,其中* Android上的默認值為{@code”:“}* @param optimizedDirectory 目錄,其中包含優化的dex文件* 應該是書面的;不能為{@code null}* @param librarySearchPath 包含本機* 庫,由{@code File.pathSeparator}分隔;可能是* {@code null}* @param parent 父類加載器*/public DexClassLoader(String dexPath, String optimizedDirectory,String librarySearchPath, ClassLoader parent) {super(dexPath, new File(optimizedDirectory), librarySearchPath, parent);} }

源碼路徑 : /libcore/dalvik/src/main/java/dalvik/system/DexClassLoader.java





四、PathClassLoader 源碼簡介



PathClassLoader 繼承了 BaseDexClassLoader 類 , 類中沒有實現任何業務邏輯 , 只是提供了一個構造函數 ;


PathClassLoader 源碼 :

/*** 提供對列表進行操作的簡單{@link ClassLoader}實現* 本地文件系統中的文件和目錄,但不嘗試* 從網絡加載類。Android將該類用作其系統類* 加載器及其應用程序類加載器。*/ public class PathClassLoader extends BaseDexClassLoader {/*** 創建一個{@code PathClassLoader},它在給定的文件列表上運行* 和目錄。此方法相當于調用* {@link#PathClassLoader(String,String,ClassLoader)}與* 第二個參數的{@code null}值(請參見此處的說明)。* * @param dexPath 包含類和* 資源,由{@code File.pathSeparator}分隔,其中* Android上的默認值為{@code”:“}* @param parent 父類加載器*/public PathClassLoader(String dexPath, ClassLoader parent) {super(dexPath, null, null, parent);}/*** 創建一個{@code PathClassLoader},它在兩個給定的* 文件和目錄的列表。第一個列表的條目* 應為以下內容之一:* * <ul>* <li>JAR/ZIP/APK文件,可能包含“classes.dex”文件* 以及任意資源。* <li>原始“.dex”文件(不在zip文件中)。* </ul>* * 第二個列表的條目應該是包含* 本機庫文件。* * @param dexPath 包含類和* 資源,由{@code File.pathSeparator}分隔,其中* Android上的默認值為{@code”:“}* @param librarySearchPath 包含本機* 庫,由{@code File.pathSeparator}分隔;可能是* {@code null}* @param parent 父類加載器*/public PathClassLoader(String dexPath, String librarySearchPath, ClassLoader parent) {super(dexPath, null, librarySearchPath, parent);} }

源碼路徑 : /libcore/dalvik/src/main/java/dalvik/system/PathClassLoader.java





五、InMemoryDexClassLoader 源碼簡介



InMemoryDexClassLoader 類加載器 繼承了 BaseDexClassLoader 類 , 與 PathClassLoader , DexClassLoader 類似 , 只提供了構造函數 , 沒有實現業務邏輯 ;

InMemoryDexClassLoader 主要用于加載內存中的 Dex 字節碼文件 , 在 Android 8.08.08.0 中加入到系統中 ;


InMemoryDexClassLoader 源碼 :

/*** 一個{@link ClassLoader}實現,從* 包含DEX文件的緩沖區。這可用于執行以下代碼:* 尚未寫入本地文件系統。*/ public final class InMemoryDexClassLoader extends BaseDexClassLoader {/*** 使用給定的DEX緩沖區創建內存中的DEX類裝入器。* * @param dexBuffers 包含之間的DEX文件的緩沖區數組* <tt>buffer.position()</tt>和<tt>buffer.limit()</tt>。* @param parent 委托的父類加載器。* @隱藏*/public InMemoryDexClassLoader(ByteBuffer[] dexBuffers, ClassLoader parent) {super(dexBuffers, parent);}/*** 創建一個新的內存中DEX類裝入器。* * @param dexBuffer 緩沖區,包含之間的DEX文件內容* <tt>buffer.position()</tt>和<tt>buffer.limit()</tt>。* @param parent 委托的父類加載器。*/public InMemoryDexClassLoader(ByteBuffer dexBuffer, ClassLoader parent) {this(new ByteBuffer[] { dexBuffer }, parent);} }

源碼路徑 : /libcore/dalvik/src/main/java/dalvik/system/InMemoryDexClassLoader.java

總結

以上是生活随笔為你收集整理的【Android 逆向】类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。