详细分析Android中实现Zygote的源码

2020-01-06 13:36:52丽君
  • }  } 
  • free(slashClassName);   
  • ALOGD("Shutting down VMn");  if (mJavaVM->DetachCurrentThread() != JNI_OK) { 
  • ALOGW("Warning: unable to detach main threadn");  } 
  • if (mJavaVM->DestoryJavaVM() != 0) {  ALOGW("Warning: VM did not shut down cleanlyn"); 
  • }  } 

    上述代码有几处关键点,分别是:

    创建虚拟机。

    注册JNI函数。

    进入Java世界。

    接下来,我们分别分析这三个关键点。

    创建虚拟机——startVm

    startVm并没有特别之处,就是调用JNI的虚拟机创建函数,但是创建虚拟机时的一些参数却是在startVm中确定的,其源码如下:

     

     
    1. #define PROPERTY_VALUE_MAX 92  /** 
    2. * Start the Dalvik Virtual Machine.  * 
    3. * Various arguments, most determined by system properties, are passed in.  * The "mOptions" vector is updated. 
    4. *  * Returns 0 on success. 
    5. */  int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIENV** pEnv) 
    6. {  int result = -1; 
    7. JavaVMInitArgs initArgs;  JavaVMOption opt; 
    8. char propBuf[PROPERTY_VALUE_MAX];  char stackTraceFileBuf[PROPERTY_VALUE_MAX]; 
    9. char dexoptFlagsBuf[PROPERTY_VALUE_MAX];  char enableAssertBuf[sizeof("-ea:")-1 + PROPERTY_VALUE_MAX];