zygote 的启动 - 2.3

  • zygote进程是 Android 系统的进程孵化器。
  • zygote 进程由 init 进程在解析 init.rc 的时候启动。
  • 在./system/core/init/readme.txt 有对于 init.rc 文件的注释。
  • init.rc 对于 zygote 的启动描述
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
  socket zygote stream 666
  onrestart write /sys/android_power/request_state wake
  onrestart write /sys/power/state on
  onrestart restart media
  onrestart restart netd
  • 可以看出 zygote 的源文件位于/system/bin/app_process(这个路径是编译后的)。 编译前的源文件位于./frameworks/base/cmds/app_process/app_main.cpp;关键参数有--zygote --start-system-server;
  • 在 main( )@app_main.cpp 中根据参数 'zygote' 与 'start-system-server'决定了接下来的调用是 start("com.android.internal.os.ZygoteInit, true) @AppRuntime(派生自 AndroidRuntime)
  • 在 start( )@AndroidRuntime 中会先通过 startVm( )启动虚拟机(此处是 Dalvik 虚拟机),然后通过 startReg( )注册 JNI,随后通过 JNI 调用到 static main( )@ZygoteInit,其中是否启动 systemServer 的参数为 true;
  • 在 main( )@ZygoteInit 中,主要有以下几步,注册 socket 的 Server 端(从 init.rc 可以得出,在启动 zygot 时,init进程会启动名为 zygote 的 socket,其权限为 666,所有用户可以读写)。预加载关键类。预加载关键资源。启动 systemServer。进入循环监听 Socke。
  • 在 registerZygoteSocket( )中,zygote 会创建一个监听 zygote Sokcet 的 SocketServer。
  • 在preloadClasses( )中会使用前面启动的虚拟机加载一些系统关键类,这些关键类在 fork( )子进程后可以认为是进程共享的。
  • 在preloadResources( )会使用前面启动的虚拟机加载一个系统关键资源。
  • zygot 对于 systemServe 的启动方式与 AMS 请求的用户进程启动方式本质相同。在子进程 fork( )之后,在子进程的返回中会将子进程系统的第一个函数入口封装为ZygoteInit$MethodAndArgsCaller 异常并且抛出。在 main( )@ZygoteInit 中会捕获这个异常同时反射调用这个函数入口。
  • 在 SystemServer 启动后,入口函数地址为 main( )@com.android.server.SystemServer.java;在 AMS 请求启动用户子进程后的入口函数为 main( )@androd.app.ActivityThread
  • 对于 SystemServer 的启动,会调用 forkSystemServer( )@Zygote 进行 fork;对于AMS 的请求会调用forkAndSpecialize( )@Zygot 进行 fork(可以参见);底层就是调用 Linux 的 fork( )进行子进程创建;
  • 在 startSystemServer( )之后,ZygoteInit接下里会执行 runSelectLoopMode( )进行一个监听 Socket 的循环,每当 AMS 有一个 Socket 连接,便会有一个 ZygoteConnection 实例化,之后执行 runOnce( )@ZygoteConnection 进行子进程孵化。在孵化的时候先会的 AMS 写入的参数,随后执行 forkAndSpecialize( )@Zygote 在底层用 Linux fork( )进行孵化子进程。在子进程的返回中就和上面说的一样,构造一个 MethodAndArgsCaller 异常,由 ZygoteInit 捕获并且执行函数入口。

你可能感兴趣的:(zygote 的启动 - 2.3)