Android 系统的java世界是怎么诞生的?孵化器zygote的初步探索

1---->app_main.cpp   (zygote进程)的入口,这个肯定是init进程来调用的)
  int main(int argc, const char* const argv[])
  {   
  runtime.start("com.android.internal.os.ZygoteInit",
                startSystemServer ? "start-system-server" : "");
  }
  
2---->AndroidRuntime.cpp
   void AndroidRuntime::start(const char* className, const char* options)
   {
    //1.startVm      start the virtual machine
   
    //2.startReg     Register android functions.
   
    //3.通过jni调用调用com.android.internal.os.ZygoteInit.java中的main方法
    //进入Java世界
   
   }
  ------->2.1 startVm做了什么?
  调用JNI创建vm的函数创建java虚拟机         
  设置一些参数,比如:全局引用数为2000,heap大小为16M等
  ------->2.2 startReg做了什么?
          给上述创建的虚拟机注册一些JNI函数,因为后续java世界中的一些函数是以native的方式
          实现的,所以要提前注册。把Android API与本地方法的注册关联起来
          
          startReg的实现方式如下(可以借鉴,在涉及到JNI开发时)
          1.遍历函数指针数组,通过函数指针来调用函数
          
          static int register_jni_procs(const RegJNIRec array[], size_t count, JNIEnv* env)
{
   for (size_t i = 0; i < count; i++) {
       if (array[i].mProc(env) < 0) {
#ifndef NDEBUG
           LOGD("----------!!! %s failed to load\n", array[i].mName);
#endif
           return -1;
       }
   }
   return 0;
}


2.RegJNIRec是个结构体:
 #ifdef NDEBUG
   #define REG_JNI(name)      { name }
   struct RegJNIRec {
       int (*mProc)(JNIEnv*);
   };
#else                              //debug版本
   #define REG_JNI(name)      { name, #name }
   struct RegJNIRec {
       int (*mProc)(JNIEnv*);
       const char* mName;
   };
#endif


         3.int AndroidRuntime::startReg(JNIEnv* env)中会调用 register_jni_procs方法。
            
           int AndroidRuntime::startReg(JNIEnv* env)
           {
            。。。
            if (register_jni_procs(gRegJNI, NELEM(gRegJNI), env) < 0) {
       env->PopLocalFrame(NULL);
       return -1;
  }
             
             
           }
         4.而 gRegJNI 的是一个  RegJNIRec类型的数组
            static const RegJNIRec gRegJNI[] = {
   REG_JNI(register_android_debug_JNITest),
   REG_JNI(register_com_android_internal_os_RuntimeInit),
   REG_JNI(register_android_os_SystemClock),
   REG_JNI(register_android_util_EventLog),
   REG_JNI(register_android_util_Log),
   REG_JNI(register_android_util_FloatMath),
   REG_JNI(register_android_text_format_Time),
   REG_JNI(register_android_content_AssetManager),
   REG_JNI(register_android_content_StringBlock),
   REG_JNI(register_android_content_XmlBlock),
   REG_JNI(register_android_emoji_EmojiFactory),
   REG_JNI(register_android_text_AndroidCharacter),
   REG_JNI(register_android_text_AndroidBidi),
   REG_JNI(register_android_text_KeyCharacterMap),
   REG_JNI(register_android_os_Process),
   REG_JNI(register_android_os_SystemProperties),
   REG_JNI(register_android_os_Binder),
   REG_JNI(register_android_view_Display),
   REG_JNI(register_android_nio_utils),
   REG_JNI(register_android_graphics_PixelFormat),
   REG_JNI(register_android_graphics_Graphics),
   REG_JNI(register_android_view_GLES20Canvas),
   REG_JNI(register_android_view_Surface),
   REG_JNI(register_android_view_TextureView),
   REG_JNI(register_com_google_android_gles_jni_EGLImpl),
   REG_JNI(register_com_google_android_gles_jni_GLImpl),
   REG_JNI(register_android_opengl_jni_GLES10),
   REG_JNI(register_android_opengl_jni_GLES10Ext),
   REG_JNI(register_android_opengl_jni_GLES11),
   REG_JNI(register_android_opengl_jni_GLES11Ext),
   REG_JNI(register_android_opengl_jni_GLES20),

   //图形绘制方面的jni函数
   REG_JNI(register_android_graphics_Bitmap),
   REG_JNI(register_android_graphics_BitmapFactory),
   REG_JNI(register_android_graphics_BitmapRegionDecoder),
   REG_JNI(register_android_graphics_Camera),
   REG_JNI(register_android_graphics_Canvas),
   REG_JNI(register_android_graphics_ColorFilter),
   REG_JNI(register_android_graphics_DrawFilter),
   REG_JNI(register_android_graphics_Interpolator),
   REG_JNI(register_android_graphics_LayerRasterizer),
   REG_JNI(register_android_graphics_MaskFilter),
   REG_JNI(register_android_graphics_Matrix),
   REG_JNI(register_android_graphics_Movie),
   REG_JNI(register_android_graphics_NinePatch),
   REG_JNI(register_android_graphics_Paint),
   REG_JNI(register_android_graphics_Path),
   REG_JNI(register_android_graphics_PathMeasure),
   REG_JNI(register_android_graphics_PathEffect),
   REG_JNI(register_android_graphics_Picture),
   REG_JNI(register_android_graphics_PorterDuff),
   REG_JNI(register_android_graphics_Rasterizer),
   REG_JNI(register_android_graphics_Region),
   REG_JNI(register_android_graphics_Shader),
   REG_JNI(register_android_graphics_SurfaceTexture),
   REG_JNI(register_android_graphics_Typeface),
   REG_JNI(register_android_graphics_Xfermode),
   REG_JNI(register_android_graphics_YuvImage),

   REG_JNI(register_android_database_CursorWindow),
   REG_JNI(register_android_database_SQLiteCompiledSql),
   REG_JNI(register_android_database_SQLiteDatabase),
   REG_JNI(register_android_database_SQLiteDebug),
   REG_JNI(register_android_database_SQLiteProgram),
   REG_JNI(register_android_database_SQLiteQuery),
   REG_JNI(register_android_database_SQLiteStatement),
   REG_JNI(register_android_os_Debug),
   REG_JNI(register_android_os_FileObserver),
   REG_JNI(register_android_os_FileUtils),
   REG_JNI(register_android_os_MessageQueue),
   REG_JNI(register_android_os_ParcelFileDescriptor),
   REG_JNI(register_android_os_Power),
   REG_JNI(register_android_os_StatFs),
   REG_JNI(register_android_os_UEventObserver),
   REG_JNI(register_android_net_LocalSocketImpl),
   REG_JNI(register_android_net_NetworkUtils),
   REG_JNI(register_android_net_TrafficStats),
   REG_JNI(register_android_net_wifi_WifiManager),
   REG_JNI(register_android_nfc_NdefMessage),
   REG_JNI(register_android_nfc_NdefRecord),
   REG_JNI(register_android_os_MemoryFile),
   REG_JNI(register_com_android_internal_os_ZygoteInit),
   REG_JNI(register_android_hardware_Camera),
   REG_JNI(register_android_hardware_SensorManager),
   REG_JNI(register_android_hardware_UsbDevice),
   REG_JNI(register_android_hardware_UsbDeviceConnection),
   REG_JNI(register_android_hardware_UsbRequest),
   REG_JNI(register_android_media_AudioRecord),
   REG_JNI(register_android_media_AudioSystem),
   REG_JNI(register_android_media_AudioTrack),
   REG_JNI(register_android_media_JetPlayer),
   REG_JNI(register_android_media_ToneGenerator),

   REG_JNI(register_android_opengl_classes),
   REG_JNI(register_android_bluetooth_HeadsetBase),
   REG_JNI(register_android_bluetooth_BluetoothAudioGateway),
   REG_JNI(register_android_bluetooth_BluetoothSocket),
   REG_JNI(register_android_server_BluetoothService),
   REG_JNI(register_android_server_BluetoothEventLoop),
   REG_JNI(register_android_server_BluetoothA2dpService),
   REG_JNI(register_android_server_NetworkManagementSocketTagger),
   REG_JNI(register_android_server_Watchdog),
   REG_JNI(register_android_ddm_DdmHandleNativeHeap),
   REG_JNI(register_android_backup_BackupDataInput),
   REG_JNI(register_android_backup_BackupDataOutput),
   REG_JNI(register_android_backup_FileBackupHelperBase),
   REG_JNI(register_android_backup_BackupHelperDispatcher),
   REG_JNI(register_android_app_backup_FullBackup),
   REG_JNI(register_android_app_ActivityThread),
   REG_JNI(register_android_app_NativeActivity),
   REG_JNI(register_android_view_InputChannel),
   REG_JNI(register_android_view_InputQueue),
   REG_JNI(register_android_view_KeyEvent),
   REG_JNI(register_android_view_MotionEvent),
   REG_JNI(register_android_view_PointerIcon),
   REG_JNI(register_android_view_VelocityTracker),

   REG_JNI(register_android_content_res_ObbScanner),
   REG_JNI(register_android_content_res_Configuration),

   REG_JNI(register_android_animation_PropertyValuesHolder),
   REG_JNI(register_com_android_internal_content_NativeLibraryHelper),
};
          
          
          5.比如 在android_util_Process.cpp中调用register_android_os_Process的注册相关JNI函数
          
            static const JNINativeMethod methods[] = {
   {"myPid",       "()I", (void*)android_os_Process_myPid},
   {"myTid",       "()I", (void*)android_os_Process_myTid},
   {"myUid",       "()I", (void*)android_os_Process_myUid},
   {"getUidForName",       "(Ljava/lang/String;)I", (void*)android_os_Process_getUidForName},
   {"getGidForName",       "(Ljava/lang/String;)I", (void*)android_os_Process_getGidForName},
   {"setThreadPriority",   "(II)V", (void*)android_os_Process_setThreadPriority},
   {"setCanSelfBackground", "(Z)V", (void*)android_os_Process_setCanSelfBackground},
   {"setThreadPriority",   "(I)V", (void*)android_os_Process_setCallingThreadPriority},
   {"getThreadPriority",   "(I)I", (void*)android_os_Process_getThreadPriority},
   {"setThreadGroup",      "(II)V", (void*)android_os_Process_setThreadGroup},
   {"setProcessGroup",      "(II)V", (void*)android_os_Process_setProcessGroup},
   {"setOomAdj",   "(II)Z", (void*)android_os_Process_setOomAdj},
   {"setArgV0",    "(Ljava/lang/String;)V", (void*)android_os_Process_setArgV0},
   {"setUid", "(I)I", (void*)android_os_Process_setUid},
   {"setGid", "(I)I", (void*)android_os_Process_setGid},
   {"sendSignal", "(II)V", (void*)android_os_Process_sendSignal},
   {"sendSignalQuiet", "(II)V", (void*)android_os_Process_sendSignalQuiet},
   {"getFreeMemory", "()J", (void*)android_os_Process_getFreeMemory},
   {"readProcLines", "(Ljava/lang/String;[Ljava/lang/String;[J)V", (void*)android_os_Process_readProcLines},
   {"getPids", "(Ljava/lang/String;[I)[I", (void*)android_os_Process_getPids},
   {"readProcFile", "(Ljava/lang/String;[I[Ljava/lang/String;[J[F)Z", (void*)android_os_Process_readProcFile},
   {"parseProcLine", "([BII[I[Ljava/lang/String;[J[F)Z", (void*)android_os_Process_parseProcLine},
   {"getElapsedCpuTime", "()J", (void*)android_os_Process_getElapsedCpuTime},
   {"getPss", "(I)J", (void*)android_os_Process_getPss},
   //{"setApplicationObject", "(Landroid/os/IBinder;)V", (void*)android_os_Process_setApplicationObject},
};

const char* const kProcessPathName = "android/os/Process";

int register_android_os_Process(JNIEnv* env)
{
   return AndroidRuntime::registerNativeMethods(
       env, kProcessPathName,
       methods, NELEM(methods));
}
          
          而AndroidRuntime::registerNativeMethods(
       env, kProcessPathName,
       methods, NELEM(methods));继续调用JNIapi函数:
       
          jniRegisterNativeMethods(env, className, gMethods, numMethods);
          
  
3----->ZygoteInit.java
       public static void main(String argv[]) {
          ---A.  建立IPC通信服务端--registerZygoteSocket,zygote进程与其他进程的通信没有用Binder而是用AF_UNIX Sockt。
                 配置建立一个local socket,以接收其它进程的进程创建请求。
                 调用registerZygoteSocket():根据环境变量中的配置建立一个local socket,以接收其它进程的进程创建请求
              
  ---B.  调用preloadClasses()预加载指定的java类
         在一个preloaded-classes文件中有1200多行,启动时加载这些类,引起慢的原因之一。
  
  ---C.  调用preloadResources()预加载指定的Resources
         在ui编程中我们引用的com.android.R.XXX就是在这里加载的       
      
      
  ---D.  调用startSystemServer()创建(fork)SystemServer进程,然后父进程zygote进入循环runSelectLoopMode(),
         子进程SystemServer调用hanldeSystemServerProcess()
         它创建的这个系统进程很重要,因为framework中的service,比如ActivityManagerService,PackageManagerService,
         WindowManagerService等都运行在这个进程中,如果它死了会导致zygote进程自杀。
     
  ---E.  调用runSelectLoopMode()
         进入死循环:监听socket,根据请求创建新进程
         至此,zygote进程的初始化工作全部完成,Android Runtime已经启动。
 
       }


*********************************************zygote任务结束,小结一下******************************************************
1.构建AppRuntime对象,并调用它的start方法,其他zygote不管了,都交给AppRuntime来做事。
2.AppRuntime在start方法里,调用startVm创建java虚拟机,并且注册JNI函数。
3.调用ZygoteInit.java的main方法,进入java世界。
4.ZygoteInit.java在main中,调用registerZygoteSocket响应子孙后代的请求。并调用
  preloadClasses,preloadResources加载一些类,一些资源。
5.zygote既然具备孵化子进程的功能,它就无中生有,造了一个人来做一些事,这个人就是SystemServer进程,java
  世界的service聚集地!
6.zygote把该做的都做好了,
  给大家创建了一个java世界,
  也为大家提供了创建进程的功能,
  也为刚创建的java世界,加载了一些这个世界需要的一些类,一些资源  
  还孵化了一个进程,让java世界中的一些非常重要的核心服务放在这个进程里,一旦这个进程死了,zygote也不想活了,也自杀。
7.zygote老人家把这些事做好了,它并没有离开这个世界,而是无时不在的在我们身边,当接受到子孙后代的请求时,它会随时
  为这些子孙后代工作。多么伟大啊!
  
  
  
  
  
    
  
  
  
  
  




      
        



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值