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

歡迎訪問 生活随笔!

生活随笔

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

Android

android classloader的功能和工作模式,Android中ClassLoader和java中ClassLoader有什么关系和不同...

發布時間:2024/10/8 Android 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android classloader的功能和工作模式,Android中ClassLoader和java中ClassLoader有什么关系和不同... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、Java中的ClassLoader是什么?

當寫好一個Java應用程序,程序都是由若干個.class類文件組織而成的,當程序在運行時,即會調用該程序的一個入口函數來調用系統的相關功能,而這些功能都被封裝在不同的class文件當中,所以經常要從這個class文件中要調用另外一個class文件中的方法,如果另外一個文件不存在的,則會引發系統異常。而程序在啟動的時候,并不會一次性加載程序所要用的所有class文件,而是根據程序的需要,通過Java的類加載機制(ClassLoader)來動態加載某個class文件到JVM中,從而只有class文件被載入到了JVM之后,才能被其它class所引用。所以ClassLoader就是用來動態加載class文件到JVM當中用的。

簡單的說Java中的ClassLoader就是加載 class 文件,提供給程序運行時使用。

二、java中ClassLoader加載原理

1、原理介紹

ClassLoader使用的是雙親委托模型來搜索類的,每個ClassLoader實例都有一個父類加載器的引用(不是繼承的關系,是一個包含的關系),虛擬機內置的類加載器(Bootstrap ClassLoader)本身沒有父類加載器,但可以用作其它ClassLoader實例的的父類加載器。當一個ClassLoader實例需要加載某個類時。加載過程是:

1.源 ClassLoader 先判斷該 Class 是否已加載,如果已加載,則直接返回 Class,如果沒有則委托給父類加載器。

2.父類加載器判斷是否加載過該 Class,如果已加載,則直接返回 Class,如果沒有則委托給祖父類加載器。

3.依此類推,直到始祖類加載器(引用類加載器)。

4.始祖類加載器判斷是否加載過該 Class,如果已加載,則直接返回 Class,如果沒有則嘗試從其對應的類路徑下尋找 class 字節碼文件并載入。如果載入成功,則直接返回 Class,如果載入失敗,則委托給始祖類加載器的子類加載器。

5.始祖類加載器的子類加載器嘗試從其對應的類路徑下尋找 class 字節碼文件并載入。如果載入成功,則直接返回 Class,如果載入失敗,則委托給始祖類加載器的孫類加載器。

6.依此類推,直到源 ClassLoader。

7.源 ClassLoader 嘗試從其對應的類路徑下尋找 class 字節碼文件并載入。如果載入成功,則直接返回 Class,如果載入失敗,源 ClassLoader 不會再委托其子類加載器,而是拋出異常。

jdk源碼中的ClassLoader

2、JVM中是如何判定兩個class是相同的呢?

JVM在判定兩個class是否相同時,不僅要判斷兩個類名是否相同,而且要判斷是否由同一個類加載器實例加載的。只有兩者同時滿足的情況下,JVM才認為這兩個class是相同的。就算兩個class是同一份class字節碼,如果被兩個不同的ClassLoader實例所加載,JVM也會認為它們是兩個不同class。

同一個Class = 相同的 ClassName + PackageName + ClassLoader

如果想了解更加具體請看如下鏈接:

三、Android 中的 ClassLoader

Android 的 Dalvik(5.0之前版本)/ART(5.0增加的) 虛擬機如同標準 Java 的 JVM 虛擬機一樣,也是同樣需要加載 class 文件到內存中來使用,但是在 ClassLoader 的加載細節上會有略微的差別。

Android打包之后的apk 應用,將apk的后綴名改成zip或rar,解壓之后會看見有一個或多個 class.dex 文件,用多個dex文件是android使用了MultiDexApplication解決65535的問題。

多個dex文件

android在安裝(installer)apk時,就對dex會進行驗證和優化,同過一個專門的工具來處理,叫 DexOpt來進行處理,處理之后會產生ODEX文件,運行Apk的時候,直接加載ODEX,避免重復驗證和優化,加快了Apk的響應時間。

總之,Android 中的 Dalvik/ART 無法像 JVM 那樣直接加載 class 文件和 jar 文件中的 class,需要通過工具來優化轉換成 Dalvik byte code 才行,只能通過 dex 或者包含 dex 的jar、apk 文件來加載(注意 odex 文件后綴可能是 .dex 或 .odex,也屬于 dex 文件),因此 Android 中的 ClassLoader 工作就交給了 BaseDexClassLoader 來處理。

BaseDexClassLoader 及其子類

從ClassLoader的android源碼看ClassLoader是一個abstract類,其具體實現的子類有BaseDexClassLoader和SecureClassLoader。

ClassLoader部門源碼

SecureClassLoader 的子類是URLClassLoader,其只能用來加載 jar 文件,這在 Android 的 Dalvik/ART 上沒法使用的。

BaseDexClassLoader 的子類是PathClassLoader和DexClassLoader。

PathClassLoader

PathClassLoader 在應用啟動時創建,從 data/app/… 安裝目錄下加載 apk 文件

PathClassLoader源碼

dexPath:文件或者目錄的列表,dex,apk,多個以文件分隔符分隔,默認是“.”

librarySearchPath:包含lib庫的目錄列表,多個以文件分隔符分隔,默認是空格

parent:父類加載器

PathClassLoader 里面除了這 2 個構造方法以外就沒有其他的代碼了,具體的實現都是在 BaseDexClassLoader 里面,其 dexPath 比較受限制,一般是已經安裝應用的 apk 文件路徑。

在 Android 中,App 安裝到手機后,apk 里面的 class.dex 中的 class 均是通過 PathClassLoader 來加載的。

DexClassLoader

A class loader that loads classes from.jar and.apk files containing aclasses.dexentry. This can be used to execute code not installed as part of an application.

根據官方給出的文檔 DexClassLoader 可以從 SD 卡上加載包含 class.dex 的 .jar 和 .apk 文件,這也是插件化和熱修復的基礎,在不需要安裝應用的情況下,完成需要使用的 dex 的加載。

DexClassLoader源碼

DexClassLoader類就只有一個方法,改方法有四個個參數

dexPath:dex文件路徑列表,多個路徑使用”:”分隔

dexOutputDir:經過優化的dex文件(odex)文件輸出目錄

libPath:動態庫路徑(將被添加到app動態庫搜索路徑列表中)

parent:這是一個ClassLoader,這個參數的主要作用是保留java中ClassLoader的委托機制(優先父類加載器加載classes,由上而下的加載機制,防止重復加載類字節碼)

android的加載是根據BaseDexClassLoader子類進行加載不通的dex而子類的實現都在BaseDexClassLoader中,BaseDexClassLoader是關鍵,下次分析BaseDexClassLoader源碼

總結

以上是生活随笔為你收集整理的android classloader的功能和工作模式,Android中ClassLoader和java中ClassLoader有什么关系和不同...的全部內容,希望文章能夠幫你解決所遇到的問題。

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