zygote服务启动

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

 

你可能感兴趣的:(java,虚拟机,android,jni,System,frameworks)