a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

詳細分析Android中實現Zygote的源碼

2020-01-26 15:00:45
字體:
來源:轉載
供稿:網友

概述

在Android系統中,所有的應用程序進程,以及用來運行系統關鍵服務的System進程都是由zygote進程負責創建的。因此,我們將它稱為進程孵化器。zygote進程是通過復制自身的方式來創建System進程和應用程序進程的。由于zygote進程在啟動時會在內部創建一個虛擬機實例,因此,通過復制zygote進程而得到的System進程和應用程序進程可以快速地在內部獲得一個虛擬機實例拷貝。
zygote進程在啟動完成之后,會馬上將System進程啟動起來,以便它可以將系統的關鍵服務啟動起來。下面我們將介紹zygote進程的啟動腳本,然后分析它和System進程的啟動過程。
zygote分析

zygote進程的啟動腳本如下:

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server  class main  socket zygote stream 660 root system  onrestart write /sys/android_power/request_state wake  onrestart write /sys/power/state on  onrestart restart media  onrestart restart netd


在我之前的一篇博客中已經分析了init進程是如何啟動service服務了,需要了解的同學可以參考這篇文章:Android init進程――解析配置文件

通過zygote服務的啟動腳本,我們可以知道,zygote進程的實際是二進制文件app_process的調用,我們就從這個應用程序的main函數入手去分析一下zygote進程的啟動過程,源碼如下(/frameworks/base/cmds/app_process/app_main.cpp):

/** * 將-Xzygote加入到JavaVMOption中,返回/system/bin參數指向的下標 */int AndroidRuntime::addVmArguments(int argc, const char* const argv[]){  int i;  for (i = 0; i < argc; i ++) {    if (argv[i][0] != '-') {      return i;    }    if (argv[i][1] == '-' && argv[i][2] == 0) {      return i + 1;    }    JavaVMOption opt;    memset(&opt, 0, sizeof(opt));    opt.optionString = (char*)argv[i];    mOptions.add(opt);  }  return i;}int main(int argc, char* const argv[]){  // zygote call parameters  // /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server  // These are global variables in ProcessState.cpp  mArgC = argc;  mArgV = argv;  mArgLen = 0;  for (int i = 0; i < argc; i ++) {    mArgLen += strlen(argv[i]) + 1;  }  // 去除末尾的空格  mArgLen--;  AppRuntime runtime;  const char* argv0 = argv[0];  // Process command line arguments  // ignore argv[0]  argc --;  argv ++;  // Everything up tp '--' or first non '-' arg goes to the vm  int i = runtime.addVmArguments(argc, argv);  // Parse runtime arguments. Stop at first unrecognized option.  bool zygote = false;  bool startSystemServer = false;  bool application = false;  const char* parentDir = NULL;  const char* niceName = NULL;  const char* className = NULL;  while (i < argc) {    const char* arg = argv[i ++];    if (!parentDir) {      parentDir = arg;    } else if (strcmp(arg, "--zygote") == 0) {      zygote = true;      niceName = "zygote";    } else if (strcmp(arg, "--start-system-server") == 0) {      startSystemServer = true;    } else if (strcmp(arg, "--application") == 0) {      application = true;    } else if (strncmp(arg, "--nice-name=", 12)) {      niceName = arg + 12;    } else {      className = arg;      break;    }  }  if (niceName && *niceName) {    setArgv0(argv0, niceName);    set_process_name(niceName);  }  runtime.mParentDir = parentDir;  if (zygote) {    // 進入到AppRuntime的start函數    runtime.start("com.android.internal.os.ZygoteInit",      startSystemServer? "start-system-server" : "");  } else if (className) {    runtime.mClassName = className;    runtime.mArgc = argc - i;    runtime.mArgv = argv + i;    runtime.start("com.android.internal.os.RuntimeInit", application ? "application" : "tool");  } else {    fprintf("stderr", "Error: no class name or --zygote supplied./n");    app_usage();    LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied");    return 10;  }}


在zygote的main函數中,通過AppRuntime runtime代碼創建了一個AppRuntime對象runtime,接下來Zygote進程就是通過它來進一步啟動的。
init.rc中關于啟動zygote命令中包含了

主站蜘蛛池模板: 国产一区二区不卡视频 | 国产福利电影在线观看 | 一级看片 | 日韩av电影观看 | 成人福利影院 | 全免费一级毛片免费看 | 香蕉av777xxx色综合一区 | 国产精品久久久久aaaa九色 | 精品一区av | 亚洲国产精品一区 | 午夜精品一区二区三区免费视频 | 波多野结衣一二三四区 | 黄色在线资源 | 性视频网站免费 | 中文字幕一区二区三 | 日韩av免费 | 成人免费xxxxxxx | 久久久免费精品视频 | 免费毛片视频 | 国产第10页| 国产精品久久久一区二区三区 | h片在线看 | 久久久久久免费毛片精品 | 久久精品国产免费看久久精品 | 91蜜桃婷婷亚洲最大一区 | 嗯嗯嗯亚洲精品国产精品一区 | 欧美区国产区 | 不卡av电影在线观看 | 久久综合狠狠综合久久综合88 | xx视频在线观看 | 久久久久无码国产精品一区 | 色综合88 | 久久99深爱久久99精品 | 男女羞羞视频在线观看 | 亚洲精品久久久久 | www.99re| 久久成人国产精品 | 国产视频网| 欧美一区二区三区免费 | 久久久久久久免费 | 久久久久女人精品毛片九一韩国 |