4.2.3 开启Java世界

JNI方法注册完毕后,AndroidRuntime:start便进入第三步:开启Java世界。在AndroidRuntime的start方法中,通过CallStaticVoidMethod这个JNI函数调用ZygoteInit的main方法开启Java世界。

ZygoteInit位于frameworks/base/java/com/android/internal/os/ZygoteInit.java,是一个Java类。定位到其main方法,代码如下:


public static void main(String argv[]){

try{

//集成虚拟机的采样工具,获取运行时快照

SamplingProfilerIntegration.start();

/注册zygote服务所需的Socket/

registerZygoteSocket();

/加载Class资源和Resource资源/

preload();

SamplingProfilerIntegration.writeZygoteSnapshot();

//强制gc

gc();

……//省略部分内容

if(argv[1].equals("start-system-server")){

startSystemServer();//启动system_server

}else if(!argv[1].equals("")){

throw new RuntimeException(argv[0]+USAGE_STRING);

}

if(ZYGOTE_FORK_MODE){//初始为false

runForkMode();

}else{

runSelectLoopMode();//执行到这里

}

closeServerSocket();

}catch(MethodAndArgsCaller caller){

caller.run();

}catch(RuntimeException ex){

closeServerSocket();//zygote异常退出

throw ex;

}

}


ZygoteInit的main方法主要做了五部分工作:

1)注册zygote的Socket。

2)预加载Class资源和Resource资源。

3)启动system_server进程。

4)执行MethodAndArgsCaller的run方法(该方法将执行SystemService的main方法)。

5)执行runSelectLoopMode方法。

这五部分的工作是Android应用程序启动和运行的基础。通过zygote的Socket, ActivityManagerService便可以通过zygote启动新的应用进程;通过预加载资源,让不同应用程序可以共享框架层资源,提高运行效率;启动system_server将开启Android的Native System Service和Java System Service,这是应用框架层运行的基础;通过runSelectLoopMode便可以处理新的应用程序运行请求。下面详细分析这五部分工作。