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

2020-01-06 13:36:52丽君

可以看到,REG_JNI是一个宏,宏里面包括的就是那个参数为JNIEnv*,返回值为int的函数指针mProc,我们以register_android_debug_JNITest为例,源码位置为/frameworks/base/core/jni/android_debug_JNITest.cpp:

 

 
  1. #define NELEM(x) (sizeof(x)/sizeof(*(x)))   
  2. int register_android_debug_JNITest(JNIEnv* env)  { 
  3. return jniRegisterNativeMethods(env, "android/debug/JNITest", gMethods, NELEM(gMethods));  } 

可以看到,mProc其实就是为Java类注册JNI函数。

进入JAVA世界

可以看到CallStaticVoidMethod最终将调用com.android.internal.os.ZygoteInit的main函数,下面就来看一下这个Java世界的入口函数。源码位置:/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java,源码如下:

 

 
  1. public static void main(String argv[])  { 
  2. try {  SamplingProfilerIntegration.start(); 
  3.   // 1. 注册zygote用的socket 
  4. registerZygoteSocket();  EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START, SystemClock.uptimeMillis()); 
  5.   // 2. 预加载类和资源 
  6. preload();  EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END, SystemClock.uptimeMillis()); 
  7.   SamplingProfilerIntegration.writeZygoteSnapshot(); 
  8.   // 强制执行一次垃圾收集 
  9. gc();   
  10. Trace.setTracingEnabled(false);   
  11. if (argv.length != 2) {  throw new RuntimeException(argv[0] + USAGE_STRING);