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