首页 > 技术文章 > 从linux看android之二--java世界的盘古女娲

zhanghaiyublog 2014-03-21 11:36 原文

在linux从内核态进入用户态运行init进程后启动的一个进程就是zygote。zygote是在android系统中创建java世界的盘古,他创建了第一个java虚拟机,同时他又是女娲,他成功地繁殖了Framework的核心system_server进程。zygote创建java世界的步骤为:

  1. 调用AppRuntime对象,并调用他的start,其余的活动都是AppRuntime控制。
  2. 调用startVm创建java虚拟机,然后调用strtReg来注册JNI函数。
  3. 通过JNI调用com.android.internal.os.ZygoteInit类的main函数,从此进入java世界。刚创建的java世界一穷二白什么都没有。
  4. 调用registerZygoteSocket,通过这个函数,他可以响应所有子孙的请求。到这里java世界有了一个牛叉的总管家,可以相应所有的子孙进程的请求。
  5. 通过调用startSystemServer分裂一个子进程system_server来管理java世界。system_server是SystemServer的进程名,SystemServer也可以简称SS。
    pid =Zygote.forkSystemServer();
    if( pid== 0){
      handleSystemServerProcess(parseArgs);#用自《深入理解Android》
    }
    从代码中可以看出:SS诞生后就和Zygote分道扬镳了,他有了新的使命。SS调用zygoteInitNative后,将与Binder通信系统建立联系,这样SS就能使用Binder了。java的核心的service--包括电源管理服务、电池管理服务、WindowManager服务、ActivityManager服务都是在这里启动的,并且这几个重要的service都是有看门狗定期巡逻的,一旦发现问题就强制重启java世界。init是进入用户态的第一个进程,所有的服务都在init里启动,同样的SS是java世界的第一个进程,所有的服务也都是在这里启动的。init作为所有进程的第一个进程自然要处理IPC通信,所以回写了/process和/dev,同样的java的第一个进程也要处理进程间通信,所以先用了BInder机制。android apk运行的程序其父进程都是zygote
    / # ps -l #不知是不是环境的问题 ps -l命令没有显示ppid 待验证
    PID   USER     TIME   COMMAND
        1 0          0:57 /init
        2 0          0:00 [kthreadd]
        3 0          0:08 [ksoftirqd/0]
  6. zygote完成了java世界的初创工作,他已经很满足了。接着调用完runSelectLoopMode后就沉沉睡去了。但是他不像盘古一睡很久,而是比盘古更亲民,zygote一旦接到子孙后代的请求,就会随时醒来,为他们服务的。

 

 

参考资料:《深入理解Android》

推荐阅读