Android安全交流群:478084054
以Android-6.0.1為例,從BaseDexClassLoader開始跟蹤一些源碼,只關(guān)心感興趣的部分。
在構(gòu)造函數(shù)中卓嫂,new了一個(gè)DexPathList對(duì)象,賦值給成員變量pathList聘殖。(BaseDexClassLoader的findClass方法就是調(diào)用pathList.findClass來(lái)查找類的)
在DexPathList的構(gòu)造函數(shù)中晨雳,調(diào)用makePathElements生成一個(gè)Element數(shù)組,賦值給dexElements奸腺。
每一個(gè)Element對(duì)象中封裝著一個(gè)DexFile:
這個(gè)數(shù)組里面每一個(gè)Element中的dexFile成員餐禁,是在makePathElements函數(shù)中調(diào)用loadDexFile加載的。
loadDexFile是DexPathList的一個(gè)靜態(tài)成員方法突照。
在loadDexFile中調(diào)用DexFile類的loadDex靜態(tài)方法加載DEX帮非。
loadDex直接new了一個(gè)DexFile對(duì)象。
在DexFile的構(gòu)造函數(shù)中讹蘑,調(diào)用openDexFile來(lái)加載DEX末盔。
openDexFile又調(diào)用了openDexFileNative。
這是一個(gè)native方法座慰,對(duì)應(yīng)art/runtime/native/dalivk_system_DexFile.cc中的DexFile_openDexFileNative靜態(tài)方法陨舱。
下一篇筆記再繼續(xù)看DexFile_openDexFileNative源碼,預(yù)留一個(gè)問題:假設(shè)要?jiǎng)討B(tài)加載DEX文件版仔,一些核心class的方法指令被抽走加密或虛擬化游盲,在運(yùn)行時(shí)再還原或解釋執(zhí)行误墓。DexFile_openDexFileNative在加載DEX時(shí),會(huì)有一個(gè)dex2opt的過程益缎,通常殼代碼會(huì)HOOK execv函數(shù)谜慌,阻止dex2opt對(duì)指定DEX文件的優(yōu)化,那么這會(huì)對(duì)DexFile_openDexFileNative的執(zhí)行產(chǎn)生哪些影響莺奔?進(jìn)一步的欣范,如果沒有生成對(duì)應(yīng)的OAT文件,那么在ART加載一個(gè)類方法時(shí)令哟,在LinkCode時(shí)會(huì)有什么影響熙卡?