上一篇文章我们已经分析到调用com.android.internal.os.ZygoteInit类的main函数。
今天分析一下com.android.internal.os.ZygoteInit类的main函数。
public static voidmain(String argv[]) {//注册zygote的socketregisterZygoteSocket();
//加载Android Application Framework使用的类与资源
preloadClasses();
preloadResources();
//启动SystemServer
if(argv[1].equals("true")) {
startSystemServer();
}/**
*处理客户端连接及请求。由zygoteConnection的runOnce函数来处理。
*/runSelectLoopMode();}
在main函数我们就主要看registerZygoteSocket()与runSelectLoopMode()。
registerZygoteSocket():就是创建一个localsocket,也就是说注册了一个zygote的服务端socket。
runSelectLoopMode():就是一直无限循环,等待客户端socket的连接,然后通过zygoteConnection的runOnce函数来处理对应的请求。
PreloadClass(): 读取framework/base/tools/preload/preload_class文件约1268类。
PreloadResources(): 加载framework-res.apk中的资源。
gc():执行垃圾收集。
那么我们就看一下registerZygoteSocket()
private static voidregisterZygoteSocket() {
String env=System.getenv(ANDROID_SOCKET_ENV);
fileDesc=Integer.parseInt(env);if (sServerSocket == null) {
sServerSocket= newLocalServerSocket(
createFileDescriptor(fileDesc));
}
}
很简单就是创建一个LocalServerSocket。
建立IPC通信服务器,从环境变量中获取(System.getenv(ANDROID_SOCKET_ENV);)socket的fd,之前用sig的fd来调用handle去创建的zygote。
我们在来看一下runSelectLoopMode()
private static voidrunSelectLoopMode() throws MethodAndArgsCaller {
…while (true) {intindex;
fdArray=fds.toArray(fdArray);
index=selectReadable(fdArray);if(index == 0) {//连接客户端发送的请求(Command)
ZygoteConnection newPeer =acceptCommandPeer();
peers.add(newPeer);
fds.add(newPeer.getFileDesciptor());
}else{//处理客户端发送的请求(Command)
boolean done;
done= peers.get(index).runOnce(); }
}
}
这个函数也很简单等待客户端发来的请求,当接收到请求时就运行run0nce函数去处理请求即可。
客户端可以理解成AMS或SystemServer。
在这里简单说明一下AMS与SystemServer
SystemServer:
Zygote的子进程,为JAVA世界做服务。
Java世界系统Service,此进程是framework的核心,此server挂掉了,zygote会自杀。
Zygote.forkSystemServer()而诞生。
AMS
ActivityManagerService是由SystemServer创建。
当一个Acitvity开启的时候,是由AMS中开启一个新的Process,而在Process类中最终会创建一个LocalSocket去连接ZYGOTE_SOCKET。
而在AMS中的startProcessLocked()中调用Process.start()函数中会传入一个参数-android.app.ActivityThread。最终会通过socket传入zygote处理。
我们继续看以下done= peers.get(index).runOnce();
boolea