Android zygote与进程创建(一)

来源:互联网 发布:石泽研究所淘宝官网 编辑:程序博客网 时间:2024/05/16 18:01
在android中,应用程序的入口是ActivityThead中的main函数,那么之后系统是怎样为应用程序创建进程的呢?SystemService又是怎样创建的?答案是:zygote

        zygote翻译成中文是受精卵的意思,名字比较奇怪、但是很有意思。在android中,大部分的应用程序进程都是由zygote来创建的,为什么用大部分,因为还有一些进程比如系统引导进程、init进程等不是有zygote创建的。相反,zygote还是在init进程之后才被创建的。在android中提到zygote,主要两块,一个是C/C++编写的zygote,主要用来为应用和SystemService fork进程的。一个是java编写的zygote接口,负责为应用和service调用C/C++ zygote的接口执行fork,从而创建VM进程。说明:在android中,service主要有NativeService和SystemService。SystemService主要是指系统中service,比如,InputMethodService、ActivityManagerService等。

       zygote在android中主要有两个作用:

       1.建立运行时环境并启动虚拟机,执行com.android.internal.os.ZygoteInit的main函数,从而fork SystemService

java代码:
  1. runtime.start("com.android.internal.os.ZygoteInit", startSystemServer); 
复制代码

       2.为应用程序创建DVM进程。

       启动SystemServer:

       我们来看看zygote是怎样创建SystemService进程的。在../base/cmds/app_process/app_main.cpp的主函数中,有这样一段代码,它执行了runtime.start("com.android.internal.os.ZygoteInit", startSystemServer);   //runtime继承自AndroidRuntime也就是说,在主函数中,初始化了运行时环境,并且建立虚拟机,然后运行再com.android.internal.os.ZygoteInit的main函数

       再来看看com.android.internal.os.ZygoteInit的main中都做了哪些事情。在看ZygoteInit之前,有必要先来看下相关的类,类图如下:

2.jpg

       在ZygoteInit的main函数中,主要执行了:

java代码:
  1. registerZygoteSocket();//登记Listen端口 
  2. startSystemServer();//启动SystemServer 
复制代码

       startSystemServer()调用Zygote的native方法 forkSystemServer(); 到这里,java端的Zygote的准备工作就结束了,接下来就交给C/C++端的Zygote来执行fork任务了。来看下代码:

       在 ../dalvik/vm/native/dalvik_system_Zygote.c 中

java代码:
  1. static void Dalvik_dalvik_system_Zygote_forkSystemServer( 
  2. const u4* args, JValue* pResult) 

  3. pid_t pid; 
  4. /*调用forkAndSpecializeCommon,执行fork */ 
  5. pid = forkAndSpecializeCommon(args, true); 
  6. /* 检查fork后返回的进程pid */ 
  7. if (pid > 0) { 
  8. int status; 
  9. LOGI("System server process %d has been created", pid); 
  10. gDvm.systemServerPid = pid; 
  11. if (waitpid(pid, &status, WNOHANG) == pid) { 
  12. LOGE("System server process %d has died. Restarting Zygote!", pid); 
  13. kill(getpid(), SIGKILL); 


  14. RETURN_INT(pid); 

复制代码

系列之Android zygote与进程创建(二)的帖子链接http://www.eoeandroid.com/thread-82885-1-1.html
原创粉丝点击