android系统启动流程之zygote如何创建SystemServer进程

SystemServer:是独立的进程,主要工作是管理服务的,它将启动大约90+种服务Services.
它主要承担的职责是为APP的运行提供各种服务,像AMS,WMS这些服务并不是一个独立的进程,
它们其实都是SystemServer进程中需要管理的的众多服务之一。

下面分析zygote启动SystemServer进程的核心代码:

ZygoteInit.main():
   ....
   //拿到的Runnable是for()出来之后的java app进程(包括SystemServer进程)
   //通过反射拿到带有main方法的Runnable对象,
   Runnable r = forkSystemServer(abiList, zygoteSocketName);
    -->Zygote.forkSystemServer();
        -->pid = nativeForkSystemServer(); //java的本地方法,需要进入JNI层去查找映射的native方法
        -->实际上调用的是com_android_internal_os_Zygote.cpp中的方法:
        -->com_android_internal_os_Zygote_nativeForkSystemServer():
            -->ForkCommon(); //里入native层的fork
                -->pid = fork(); //系统的api. 最终由它创建出SystemServer进程
                   if(pid == 0){ //孩子进程
                   
                   }else{ //返回的pid是孩子进程的pid,表示这个是父进程,就是zygote进程本身,这是孩子告诉父亲Zgote它的pid号
                   
                   }
                   return pid;
            return pid;//对应nativeForkSystemServer()层级,意味着nativeForkSystemServer也会返回2次。
       //对应forkSystemServer()层级
       //后面的代码也都会有2个进程执行,孩子 进程和父进程
       if(pid == 0) //孩子 进程
       {
          zygoteServer.closeServerSocket(); //关闭句柄,对孩子 进程来说,这个句柄没用了。
          return handleSystemServerProcess(); //孩子 进程就是SystemServer啦,返回的是Runnable对象。
            //创建SystemServer进程运行需要的各种参数
            -->cl = createPathClassLoader(systemServerClasspath, parsedArgs.mTargetSdkVersion);
                  -->ClassLoaderFactory.createClassLoader(classpath, libraryPath...);
            -->ZygoteInit.zygoteInit(parsedArgs.mTargetSdkVersion,parsedArges.mDisabledCompatChanges,parsedArgs.mRemainingArgs, cl); //传入SystemServer中的各种参数
                  -->RuntimeInit.commonInit();//初始化运行环境 
                     ZygoteInit.nativeZygoteInit();//启动Binder
                     //通过反射创建程序入口函数的Method对象,并返回 Runnable对象。
                     return RuntimeInit.applicationInit(...) //启动SystemServer 系统app进程,其它普通app进程也是同样的方法
                        -->m = cl.getMethod("main" new class[]{String[].class}) 
                           //目的未来通过反射执行java的main函数来启动java进程
                            
       }else{ //父进程
       
       }
      r.run(); //在这里执行启动app进程(包括SystemServer) 

下面用一张图来表示上面的代码过程:

android系统启动流程之zygote如何创建SystemServer进程_第1张图片

前面的流程是说明Zygote进程如何fork创建出SystemServer进程,需要知道的是SystemServer进程被fork()出来之后,到底是如何运行的,如果这个逻辑研究明白了,Zygote fork其它进程后,它们的运行逻辑也是相同的。linux程序在调用fork之后,如果创建成功,会返回两个pid, 其中一个是孩子的pid,上面代码在这个过程分析的时候需要特别注意

你可能感兴趣的:(Android系统,zygote,SystemServer,android)