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

2020-01-06 13:36:52丽君
  • } else if (strcmp(propBuf, "int:jit") == 0) {  executionMode = KEMJitCompiler; 
  • }   
  • // ... 省略大部分参数设置   
  • /**  * 设置虚拟机的heapsize,默认为16m。绝大多数厂商都会在build.prop文件里修改这个属性,一般是256m。 
  • * heapsize不能设置得过小,否则在操作大尺寸的图片时无法分配所需的内存。  */ 
  • strcpy(heapsizeOptsBuf, "-Xmx");  property_get("dalvik.vm.heapsize", heapsizeOptsBuf+4, "16m"); 
  • opt.optionString = heapsizeOptsBuf;  mOptions.add(opt); 
  •   // ...... 
  •   if (JNI_CreateJavaVM(pJavaVM, pEnv, &initArgs) < 0) { 
  • ALOGE("JNI_CreateJavaVM failedn");  goto bail; 
  • }   
  • result = 0;   
  • bail:  free(stackTraceFile); 
  • return result;  } 

    更多虚拟机参数的设置,我这里就不做特殊说明了,大家感兴趣可以自行google。(ps:因为我不太懂虚拟机这一块…)

    注册JNI函数——startReg

    上面讲了如何创建虚拟机,接下来需要给这个虚拟机注册一些JNI函数。正是因为后续的Java世界用到的一些函数是采用native方式实现的,所以才必须提前注册这些函数。

    接下来,我们来看一下startReg函数的源码实现:

     

     
    1. int AndroidRuntime::startReg(JNIEnv* env)  { 
    2. // 设置Thread类的线程创建函数为javaCreateThreadEtc  androidSetCreateThreadFunc((android_create_thread_fn) javaCreateThreadEtc);