【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 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 逆向】类加载器 Cla
- 下一篇: 【开发环境】安装 Visual Stud