Android安全交流群:478084054
還是以Android-6.0.1源碼為例,從BaseDexClassLoader的findClass開始跟蹤一些源碼。
調用成員變量pathList的findClass方法來查找類。
在DexPathList類的findClass方法中,遍歷dexElements數組的每一個成員(前面筆記提到過,每一個Element對象里面封裝著一個DexFile),然后調用DexFile的loadClassBinaryName方法來加載類。
loadClassBinaryName又調用了defineClass。
defineClass又調用了native方法defineClassNative。
defineClassNative對應art/runtime/native/dalvik_system_DexFile.cc中的DexFile_defineClassNative方法。
這里還是只抓主干,不過多關注一些旁枝末節。在DexFile_defineClassNative方法中,調用class_linker對象的DefineClass來加載類。(在創建ART虛擬機的過程中,會創建一個ClassLinker對象,用于加載類和鏈接類方法)
ClassLinker方法的內容比較多,只關注其中最關鍵的幾步。先調用InsertClass將新類添加到已加載類的列表中。再調用LoadClass和LinkClass來加載和鏈接類。
調用FindOatClass查找與被加載類對應的OatClass,然后調用LoadClassMembers加載類的成員。
前面筆記中做過一種假設,就是DEX加固殼阻止了指定DEX生成OAT文件的過程,這種情況下傳給LoadClassMembers方法的oat_class參數為nullptr。
下篇筆記繼續。