作者 [email protected]
本节分析dalvik虚拟机是通过何种方式选择解释器的。
查找系统属性里解释器执行模式
int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)
{
…
//取出系统属性“dalvik.vm.execution-mode”
property_get("dalvik.vm.execution-mode", propBuf, "");
if (strcmp(propBuf, "int:portable") == 0) {
/*portable解释器,这个是标配,但是不是默认使用的解释器。在有些新的架构处理器上没有别的解释器可用,可以先用这个。*/
executionMode = kEMIntPortable;
} else if (strcmp(propBuf, "int:fast") == 0) {
/* “executionMode=2”,所谓fast解释器就是汇编优化过,但是没有jit功能的解释器,jit对于小系统有可能带来副作用,这个解释器是不错选择*/
executionMode = kEMIntFast;
#if defined(WITH_JIT)
} else if (strcmp(propBuf, "int:jit") == 0) {
/*“ executionMode=3”,既汇编优化又带jit功能。如果是arm v7以上的机器,就是这个了。*/
executionMode = kEMJitCompiler;
#endif
}
…
}
解释器选择:根据执行模式解释器选择器。在解释器入口处有很多处理,这里仅关注解释器选择。
void dvmInterpret(Thread* self, const Method* method, JValue* pResult)
{ …
if (gDvm.executionMode == kExecutionModeInterpFast)
// “dvmMterpStd”是asm优化但不带jit功能的实现
stdInterp = dvmMterpStd;
#if defined(WITH_JIT)
else if (gDvm.executionMode == kExecutionModeJit)
/*“dvmMterpStd”是asm优化但带jit功能的实现,与上者的区别在编译选项“WITH_JIT”是否激活 */
stdInterp = dvmMterpStd;
#endif
Else
//Portable解释器,入口函数是“void dvmInterpretPortable(…)”
stdInterp = dvmInterpretPortable;
…
}