〇、ClassLoader就是類加載器,作用是將編譯后的class文件加載到虛擬機中,使之成為java類
一、Android中有哪幾種ClassLoader?它們的作用和區(qū)別是什么?
- BootClassLoader:主要加載Android Framework層的字節(jié)碼文件
- PathClassLoader:主要加載已經(jīng)安裝到系統(tǒng)中的apk文件中的字節(jié)碼文件
- DexClassLoader:主要加載沒有安裝到系統(tǒng)中的apk,jar文件中的字節(jié)碼文件
- BaseDexClassLoader:PathClassLoader和DexClassLoader的父類,真正實現(xiàn)功能的代碼都在這個ClassLoader中
二、簡述ClassLoader的雙親委托模型
- 首先查找當(dāng)前類加載器是否加載過這個類,如果找到則返回這個類
- 如果找不到,就會調(diào)用父類的方法去查找是否加載過這個類,如果父類沒有加載過就去查找祖父類加載器是否加載過,按照這樣的邏輯一直查找到最上層的類加載器(始祖類加載器),因為始祖加載器沒有 parent 了,就用引導(dǎo)類加載器去查找。
- 如果還沒有找到就說明這個類 JVM 確實沒有加載過,然后嘗試使用引導(dǎo)類加載器加載這個類,如果成功則返回類,加載失敗就再次嘗試使用始祖類加載器,依次類推如果當(dāng)前類加載器都加載失敗則拋出異常
- 小結(jié):這樣做保證的類只會加載一次
三、簡述雙親委托模型在熱修復(fù)領(lǐng)域的應(yīng)用
熱修復(fù)的原理就是要替換類文件,
Android 的虛擬機( 基于寄存器 )與 Java 的虛擬機(基于棧)有些不同,它加載的不是 .class 字節(jié)碼,而是 .dex 文件(可以通過 Google 提供的 dx 工具對 .class 文件轉(zhuǎn)換得到),所以上面提到的替換類文件就是等于替換 DEX 文件。
通過 PathClassLoader 來加載我們自身 App 的 dex 文件。
通過 DexClassLoader 來加載我們的沒有 BUG 補丁dex 文件。
首先通過反射拿到分別兩個 ClassLoader 的 < DexPathList pathList > ( 一個是我們自己應(yīng)用的,另一個是我們補丁的 )
然后再次通過反射拿到分別兩個 ClassLoader 中 pathList 里面的 <Element[] dexElements > 的值。
合并兩個反射到的 Element 數(shù)組。( 需要把我們的補丁 dex 中的數(shù)組放在合并的數(shù)組最前面 )
將合并的新的數(shù)組,再次通過反射重新設(shè)置到我們自身 App 的 DexPathList 中,根據(jù)雙親委托模型類加載器會首先加載沒有 BUG 的類
老實交代作業(yè)我參考了http://www.itdecent.cn/p/2b71f5d79595,不過我每一條都認真看了