Android安全交流群:478084054
還是以Android-6.0.1源碼為例,從BaseDexClassLoader的findClass開始跟蹤一些源碼崔列。
調用成員變量pathList的findClass方法來查找類颅痊。
在DexPathList類的findClass方法中,遍歷dexElements數(shù)組的每一個成員(前面筆記提到過浊猾,每一個Element對象里面封裝著一個DexFile)槐沼,然后調用DexFile的loadClassBinaryName方法來加載類。
loadClassBinaryName又調用了defineClass憨降。
defineClass又調用了native方法defineClassNative父虑。
defineClassNative對應art/runtime/native/dalvik_system_DexFile.cc中的DexFile_defineClassNative方法。
這里還是只抓主干授药,不過多關注一些旁枝末節(jié)士嚎。在DexFile_defineClassNative方法中,調用class_linker對象的DefineClass來加載類悔叽。(在創(chuàng)建ART虛擬機的過程中莱衩,會創(chuàng)建一個ClassLinker對象,用于加載類和鏈接類方法)
ClassLinker方法的內(nèi)容比較多娇澎,只關注其中最關鍵的幾步笨蚁。先調用InsertClass將新類添加到已加載類的列表中。再調用LoadClass和LinkClass來加載和鏈接類趟庄。
調用FindOatClass查找與被加載類對應的OatClass括细,然后調用LoadClassMembers加載類的成員。
前面筆記中做過一種假設戚啥,就是DEX加固殼阻止了指定DEX生成OAT文件的過程奋单,這種情況下傳給LoadClassMembers方法的oat_class參數(shù)為nullptr。
下篇筆記繼續(xù)猫十。