Android安全交流群:478084054
artInterpreterToCompiledCodeBridge用于從一個(gè)解釋執(zhí)行的類方法跳到另一個(gè)以本地機(jī)器指令執(zhí)行的類方法去執(zhí)行愁茁。
以Android 6代碼為例(貼代碼時(shí)党涕,為了主干清晰肝匆,省略了部分代碼)列肢。
首先得到要調(diào)用的method卧檐,如果是靜態(tài)方法并且類還沒有初始化,則調(diào)用ClassLinker類的成員函數(shù)EnsureInitialized來初始化類雷则。
最后會(huì)調(diào)用ArtMethod的Invoke方法來找到類方法的本地機(jī)器指令去執(zhí)行死嗦。
假設(shè)是arm架構(gòu),并且是非靜態(tài)方法牡辽,則會(huì)調(diào)用art_quick_invoke_stub喳篇。
繼續(xù)跟代碼。
繼續(xù)quick_invoke_reg_setup态辛。
先準(zhǔn)備一些寄存器麸澜,并將方法參數(shù)設(shè)置好,然后調(diào)用art_quick_invoke_stub_internal奏黑。
art_quick_invoke_stub_internal由匯編語言編寫炊邦。看陰影覆蓋的兩行代碼熟史,r0保存method對(duì)象的地址馁害,根據(jù)偏移ART_METHOD_QUICK_CODE_OFFSET_32找到機(jī)器指令的地址,然后blx跳轉(zhuǎn)執(zhí)行蹂匹。
36正好是entry_point_from_quick_compiled_code_成員在method對(duì)象中的偏移碘菜。
最后貼一下art_quick_invoke_stub_internal的注釋。
本篇筆記簡單的跟了一下artInterpreterToCompiledCodeBridge的執(zhí)行流程,大概了解一下從解釋器到另一個(gè)以本地機(jī)器指令執(zhí)行的類方法的執(zhí)行過程忍啸。