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,上面代码在这个过程分析的时候需要特别注意