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便可以处理新的应用程序运行请求。下面详细分析这五部分工作。