zygote是android启动及其运行时非常重要的一个服务进程,下面是它在启动过程中函数执行路线,比较简略,后面将上图。
zygote, app_process, main()
--> runtime[AppRuntime<AndroidRuntime>].start("com.android.internal.os.ZygoteInit", startSystemServer)
// startSystemServer = true 表示将会在后面启动systemserver进程
--> startVm(&mJavaVM, &env) // 新建一个虚拟机
--> startReg(env) // 注册frameworks/base/core/jni/下的所有jni接口
--> 虚拟机启动之前构造java形式的参数数组,strArray[0] = “com.android.internal.os.ZygoteInit,strArry[1] = “true”
--> 根据上面包名提供的路径找到这个包
--> 在这个包中找到静态main函数,然后调用它,这个时候就成功调用了java程序,也是在前面新建的虚拟机中运行的。
// frameworks/base/core/java/com/android/internal/os/ZygoteInit.java 中的main函数
--> startSystemServer()
--> Zygote.forkSystemServer()// 父进程直接返回true,子进程执行handleSystemServerProcess()
/********** 子进程-转下 ****************/
/********** 父进程 ****************/
--> return true;
--> runSelectLoopMode() // zygote进程进入死循环,通过socket接收消息,fork虚拟机
while (true) {
...
while(true){
...
try {
fdArray = fds.toArray(fdArray);
index = selectReadable(fdArray);
}
...
if (index < 0) {
throw new RuntimeException("Error in select()");
} else if (index == 0) {
ZygoteConnection newPeer = acceptCommandPeer();
// Waits for and accepts a single command connection
peers.add(newPeer);
fds.add(newPeer.getFileDesciptor());
} else {
boolean done;
done = peers.get(index).runOnce();
/* 调用 ZygoteConnecttion的runOnce函数,在runOnce函数中调用
Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, parsedArgs.gids,
parsedArgs.debugFlags, rlimits),Forks a new VM instance。
然后,在runOnce函数中通过 if (pid == 0) {
// in child
handleChildProc(parsedArgs, descriptors, newStderr);
在子进程中处理相关的操作,而父进程继续在 runSelectLoopMode的while(true)循环中select等待。*/
if (done) {
peers.remove(index);
fds.remove(index);
}
}
}
}
/********** 父进程 ****************/
/********** 子进程-接上 ****************/
--> handleSystemServerProcess()
--> RuntimeInit.zygoteInit(parsedArgs.remainingArgs)
// "--nice-name=system_server com.android.server.SystemServer"
--> invokeStaticMain(startClass, startArgs)
--> ZygoteInit.MethodAndArgsCaller(m, argv) // 找到com.android.server.SystemServer包的main函数执行
// frameworks/base/services/java/com/android/server/SystemServer.java
--> System.loadLibrary("android_servers")
--> init1(args)
// jni调用,最终调用到c++部分:frameworks\base\cmds\system_server\library\System_init.cpp
// 启动一些本地服务:AudioFlinger 、MediaPlayerService 、CameraService 、AudioPolicyService 等
--> init2() // init2函数开启一个ServerThread线程, SystemServer.java
--> start()
--> run()
// 启动系统中java services,之后执行xxx.systemReady()通知系统已经准备就绪
// 接下来就启动home进程了
--> (ActivityManagerNative.getDefault()).systemReady(callback)
--> resumeTopActivityLocked()
--> startHomeActivityLocked()
--> startActivityLocked() // 启动home
--> Looper.loop() // msg queue
启动图:
图原型来自:http://blog.csdn.net/maxleng/article/details/5508372