Android安全交流群:478084054
Android ClassLoader的類繼承關(guān)系:
即:
ClassLoader類有兩個(gè)核心方法:loadClass和findClass盹憎。
ClassLoader的各子孫類繼承l(wèi)oadClass方法并且通常不會(huì)復(fù)寫(Overriding)舔痕,所以每個(gè)類加載器的loadClass方法都會(huì)先調(diào)用parent類加載器(各種類型的類加載器在構(gòu)造時(shí)都會(huì)傳入一個(gè)parent類加載器)的loadClass進(jìn)行加載后德,失敗之后才會(huì)調(diào)用本類的findClass進(jìn)行加載闸餐,這種工作模式被稱為“雙親委派模型”腮出。
雙親委派模型的工作過程為:如果一個(gè)類加載器收到了類加載的請求说订,它首先不會(huì)自己去嘗試加載這個(gè)類埠啃,而是把這個(gè)請求委派給父加載器去完成济竹,每一個(gè)層次的加載器都是如此,因此所有的類加載請求都會(huì)傳給頂層的啟動(dòng)類加載器冤寿,只有當(dāng)父加載器反饋?zhàn)约簾o法完成該加載請求(該加載器的搜索范圍中沒有找到對應(yīng)的類)時(shí)歹苦,子加載器才會(huì)嘗試自己去加載。
看一下ClassLoader的直接子類BaseDexClassLoader的findClass方法:
調(diào)用成員變量pathList的findClass進(jìn)行加載督怜。
成員變量pathList的類型為DexPathList殴瘦,其findClass方法如下:
依次嘗試從dexPath路徑下的每一個(gè)dex文件中進(jìn)行加載(調(diào)用DexFile類的loadClassBinaryName方法)。
defineClass是DexFile類的靜態(tài)方法:
最終調(diào)用到native方法defineClassNative号杠,具體實(shí)現(xiàn)在“/dalvik/vm/native/dalvik_system_DexFile.cpp”文件中:
在這加一些log蚪腋,能夠看到所加載的類在哪一個(gè)dex或jar文件中定義,這對于dex脫殼很有幫助姨蟋。
子類DexClassLoader沒有復(fù)寫父類BaseDexClassLoader的findClass方法屉凯,所以加載類的方式是一樣的。
參考文章: