Zygote进程启动流程

博客同步至github博客:Zygote进程启动流程

使用到的相关源码:https://github.com/JesusYoung/AndroidResourceCode9.0/tree/master

基于Android 9.0

1、Zygote进程

Zygote是在init进程启动时创建的,它又称为孵化器,它可以通过fork(复制进程)的形式来创建应用程序进程和SystemServer进程,并且,Zygote进程在启动的时候会创建DVM或者ART,因此通过fork而创建的应用程序进程和SystemServer进程可以在内部获取一个DVM或者ART的实例副本;

2、Zygote进程启动流程

2.1、Init进程调用

2.1.1、解析配置参数

Init进程启动之后,解析init.rc配置文件,执行其配置,其中有启动Zygote进程的参数配置,在app_main.cpp的main()方法中,先解析参数,例如在前面解析.rc文件时添加的参数“–zygote、----start-system-server”等,初始化各种标识位;

int main(int argc, char* const argv[]) {
   
	...
  ++i;  // Skip unused "parent dir" argument.
  while (i < argc) {
   
    const char* arg = argv[i++];
    if (strcmp(arg, "--zygote") == 0) {
   
      zygote = true;
      niceName = ZYGOTE_NICE_NAME;
    } 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) == 0) {
   
      niceName.setTo(arg + 12);
    } else if (strncmp(arg, "--", 2) != 0) {
   
      className.setTo(arg);
      break;
    } else {
   
      --i;
      break;
    }
  }
  ...
}
2.1.2、启动Dalvik虚拟机

接着判断className是否为空,在Zygote模式下,调用maybeCreateDalvikCache()函数创建Dalvik虚拟机缓存,添加启动systemServer的参数标识;

int main(int argc, char* const argv[]) {
   
	...
	if (!className.isEmpty()) {
   
    ...
  } else {
   
    // We're in zygote mode.
    maybeCreateDalvikCache();
    if (startSystemServer) {
   
      args.add(String8("start-system-server"));
    }
    char prop[PROP_VALUE_MAX];
    if (property_get(ABI_LIST_PROPERTY, prop, NULL) == 0
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若邪〃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值