1检诗、Android中有哪幾種ClassLoader?它們的作用和區(qū)別是什么悠轩?
-
BootClassLoader
系統(tǒng)啟動(dòng)時(shí)創(chuàng)建的攻泼,是 PathClassLoader 的父加載器,PathClassLoader 繼承自 BaseDexClassLoader何鸡,但是底層返回父類加載器返回的是 BootClassLoader牛欢。這個(gè)類與 ClassLoader 同級(jí)存在于一個(gè)文件中。
-
PathClassLoader
應(yīng)用啟動(dòng)時(shí)創(chuàng)建的隔盛,從 data/app/… 安裝目錄下加載 apk 文件拾稳。App 安裝到手機(jī)之后,apk 里面的 class.dex 中的 class 都是通過(guò) PathClassLoader 來(lái)加載的
-
BaseDexClassLoader
ClassLoader 是個(gè)抽象類来屠,具體實(shí)現(xiàn)的子類有 BaseDexClassLoader 和 SecureClassLoader震鹉。SecureClassLoader 的子類是 URLClassLoader 捆姜,其只能用來(lái)加載 jar 文件,這在 Android 的 Dalvik/ART 上沒(méi)法使用的浆兰。
Android 的 Dalvik/ART 不像 JVM 可以直接加載 class 文件,和 jar 文件中的 class榕订,需要轉(zhuǎn)化為 Dalvik byte code 才可以蜕便。只能通過(guò) dex 或者 包含 dex 的 jar、apk 文件來(lái)加載两嘴,所有 Android 里面的 ClassLoader 都是由 BaseDexClassLoader 來(lái)處理族壳。基本所有 classlaoder 都是繼承了 BaseDexClassLoader仿荆。
2、簡(jiǎn)述ClassLoader的雙親委托模型
創(chuàng)建 Class 時(shí)首先去找對(duì)應(yīng)的 ClassLoader 有沒(méi)有被加載過(guò)枉圃,沒(méi)加載過(guò)就詢問(wèn)父類庐冯,父類加載器再判斷是否加載過(guò),然后依次往父類詢問(wèn)返劲。一直到最頂級(jí)的父加載器還找不到的話栖茉,自身就創(chuàng)建一個(gè),這樣保證一個(gè)類只會(huì)創(chuàng)建唯一的一個(gè)類加載器吕漂。
3、簡(jiǎn)述雙親委托模型在熱修復(fù)領(lǐng)域的應(yīng)用
Android 中查找類會(huì)在一個(gè) dex 數(shù)組中遍歷吼虎,一旦找到就不會(huì)往后找苍鲜,熱修復(fù)只要把修復(fù)后的類排在有 bug 的類之前,由于雙親委托機(jī)制洒疚,先加載到修復(fù)好的類,就不會(huì)加載到后面的 bug 類油湖。