Android安全交流群:478084054
artInterpreterToCompiledCodeBridge用于从一个解释执行的类方法跳到另一个以本地机器指令执行的类方法去执行。
以Android 6代码为例(贴代码时,为了主干清晰,省略了部分代码)。
首先得到要调用的method,如果是静态方法并且类还没有初始化,则调用ClassLinker类的成员函数EnsureInitialized来初始化类。
最后会调用ArtMethod的Invoke方法来找到类方法的本地机器指令去执行。
假设是arm架构,并且是非静态方法,则会调用art_quick_invoke_stub。
继续跟代码。
继续quick_invoke_reg_setup。
先准备一些寄存器,并将方法参数设置好,然后调用art_quick_invoke_stub_internal。
art_quick_invoke_stub_internal由汇编语言编写。看阴影覆盖的两行代码,r0保存method对象的地址,根据偏移ART_METHOD_QUICK_CODE_OFFSET_32找到机器指令的地址,然后blx跳转执行。
36正好是entry_point_from_quick_compiled_code_成员在method对象中的偏移。
最后贴一下art_quick_invoke_stub_internal的注释。
本篇笔记简单的跟了一下artInterpreterToCompiledCodeBridge的执行流程,大概了解一下从解释器到另一个以本地机器指令执行的类方法的执行过程。