Android中的ClassLoader

〇、ClassLoader就是類加載器,作用是將編譯后的class文件加載到虛擬機中,使之成為java類

一、Android中有哪幾種ClassLoader?它們的作用和區(qū)別是什么?

  1. BootClassLoader:主要加載Android Framework層的字節(jié)碼文件
  2. PathClassLoader:主要加載已經(jīng)安裝到系統(tǒng)中的apk文件中的字節(jié)碼文件
  3. DexClassLoader:主要加載沒有安裝到系統(tǒng)中的apk,jar文件中的字節(jié)碼文件
  4. BaseDexClassLoader:PathClassLoader和DexClassLoader的父類,真正實現(xiàn)功能的代碼都在這個ClassLoader中

二、簡述ClassLoader的雙親委托模型

  1. 首先查找當(dāng)前類加載器是否加載過這個類,如果找到則返回這個類
  2. 如果找不到,就會調(diào)用父類的方法去查找是否加載過這個類,如果父類沒有加載過就去查找祖父類加載器是否加載過,按照這樣的邏輯一直查找到最上層的類加載器(始祖類加載器),因為始祖加載器沒有 parent 了,就用引導(dǎo)類加載器去查找。
  3. 如果還沒有找到就說明這個類 JVM 確實沒有加載過,然后嘗試使用引導(dǎo)類加載器加載這個類,如果成功則返回類,加載失敗就再次嘗試使用始祖類加載器,依次類推如果當(dāng)前類加載器都加載失敗則拋出異常
  4. 小結(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,不過我每一條都認真看了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容