详细分析Android中实现Zygote的源码

2020-01-06 13:36:52丽君

在zygote的main函数中,通过AppRuntime runtime代码创建了一个AppRuntime对象runtime,接下来Zygote进程就是通过它来进一步启动的。

init.rc中关于启动zygote命令中包含了–zygote参数,所以在if(strcmp(arg, “–zygote”) == 0)判断的时候,会将niceName赋值为”zygote”,然后通过set_process_name(niceName)函数将当前进程的名称设置为zygote。这也是为什么调用的脚本为/system/bin/app_process,而进程名为zygote的原因。set_process_name函数的源码如下(/system/core/libcutils/process_name.c):

 

 
  1. static const char* process_name = "unknown";  void set_process_name(const char* new_name) 
  2. {  if (new_name == NULL) { 
  3. return;  } 
  4.   int len = strlen(new_name); 
  5. char* copy = (char*)malloc(len + 1);  strcpy(copy, new_name); 
  6. process_name = (const char*) copy;  } 

从init.rc文件中关于zygote进程的配置参数可知,Zygote进程传递给应用程序app_process的启动参数arg还包含一个”–start-system-server”选项。因此,在调用AppRuntime对象runtime的成员函数start时,第二个参数为”start-system-server”,表示zygote进程启动完成之后,需要将system进程启动起来。

AppRuntime分析

AppRuntime类的成员函数start是从父类AndroidRuntime继承下来的,因此,接下来我们就继续分析AndroidRuntime类的成员函数start的实现,函数源码位置:/frameworks/base/core/jni/AndroidRuntime.cpp:

 

 
  1. char* AndroidRuntime::toSlashClassName(const char* className)  {