1、ZygoteInit源码
CallStaticVoidMethod最终将调用com.android.internal.os.ZygoteInit的main函数,这里是函数代码,如下所示:
base/core/java/com/android/internal/os/ZygoteInit.java
public static void main(String argv[]) {
try {
VMRuntime.getRuntime().setMinimumHeapSize(5 * 1024 * 1024);
// Start profiling the zygote initialization.
SamplingProfilerIntegration.start();
//1、注册zygote用的socket
registerZygoteSocket();
EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,
SystemClock.uptimeMillis());
//2、预加载类和资源
preloadClasses();
//cacheRegisterMaps();
preloadResources();
EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,
SystemClock.uptimeMillis());
// Finish profiling the zygote initialization.
SamplingProfilerIntegration.writeZygoteSnapshot();
// Do an initial gc to clean up after startup
gc();
// If requested, start system server directly from Zygote
if (argv.length != 2) {
throw new RuntimeException(argv[0] + USAGE_STRING);
}
if (argv[1].equals("true")) {
//3、启动system_server进程
startSystemServer();
} else if (!argv[1].equals("false")) {
throw new RuntimeException(argv[0] + USAGE_STRING);
}
Log.i(TAG, "Accepting command socket connections");
if (ZYGOTE_FORK_MODE) {
runForkMode();
} else {
//4、zygote调用这个函数
runSelectLoopMode();
}
closeServerSocket();
} catch (MethodAndArgsCaller caller) {
//5、很重要的一个方法
caller.run();
} catch (RuntimeException ex) {
Log.e(TAG, "Zygote died with exception", ex);
closeServerSocket();
throw ex;
}
}
2、IPC通信服务端
zygote及系统中其它程序的通信没有使用Binder,而是采用了基于AF_UNIX类型的Socket,registerZygoteSocket函数的使命是建立这个Socket。
/**
* Registers a server socket for zygote command connections
*