(Android基础)Zygote进程的启动流程

##概述:

init进程通过启动app_process进程并创建Java虚拟机后,使用JNI调用由Java编写的Zygote代码。
Zygote进程通过已加载的Java虚拟机从而可以运行Android应用、Zygote进程通过fork()创建子进程,避免了子进程的重复初始化虚拟机以及加载Framework类库和资源的操作。

1.init进程启动完系统运行所需的各种Deamon后,启动Zygote进程。Zygote启动完成之后,Android的服务与应用程序都由Zygote进程启动运行(tips:Android系统中运行的进程主要分为三类:内核进程,由init进程启动的Deamon进程,由Zygote启动的Android的服务和应用程序)

2.Linux系统中创建并运行一个进程,与在Android系统中通过Zygote来创建并运行一个进程的区别

在Linux系统中:

图片加载失败

  • 一:进程A通过fork()函数创建一个新的进程,新创建的进程A`共享父进程A的内存结构与库连接信息
  • 二:进程A通过调用exec(B`),将进程B的代码加载到内存中,此时父进程A的内存信息被清除,并从新分配内存,以便运行被装载的进程B,接着形成新的库连接信息,供进程B使用。

在Android系统中:

  • 1.Zygote在被启动之后,进行一系列的初始化,套接字的绑定,执行预加载类库和资源,启动SystemServer进程。
  • 2.Zygote进程调用fork()函数创建出Zygote子进程,子进程Zygote共享父进程Zygote的代码区和连接信息。
  • 3.子进程Zygote`动态加载Application A的代码,应用程序A开始运行。新生成的应用程序A会使用已有的Zygote进程的库与资源连接信息。
    tips:(Copy on Write)在创建新进程后新进程会共享父进程的内存空间,即新的子进程会复制所有与父进程虚拟内存相关的信息并使用它。COW是针对内存复制的一种技术。它会在执行完fork()后将父进程的页表复制一份到子进程,并将内存的页面操作位全部置为只读。当其中一个进程试图改变页面内容时会产生段错误信号。CPU获得该信号后,将需要写入的页面复制一份到对应进程中,并将原页面置为可读可写。

3.运行ZygoteInit类

app_process进程初始化好Java虚拟机后,将ZygoteInit类装载到虚拟机中.ZygoteInit开始运行

图片记载失败

  • 1.通过registerZygoteSocket方法,绑定已在init进程中注册的socket端口
  • 2.通过preloadClasses预加载类库,通过preloadResource加载资源
  • 3.通过startSystemServer启动SystemService进程
  • 4.runSelectLoop处理新应用程序的请求
您的一份奖励,就是我的一份激励