Android Zygote 启动流程

Zygote 进程介绍

介绍

  • 在 Android 中,DVM、ART、和应用程序进程以及系统关键服务的 SystemServer 进程都是由 Zygote 进程创建,它被称为孵化器
  • 通过 fork 方式,创建应用程序进程和 SystemServer 进程,由于 Zygote 进程在启动的时候会创建 DVM 或者 ART,因为通过 fork 而创建的应用程序和 SystemServer 进程可以在内部获取一个 DVM 或者 ART 实例

Zygote 启动

  • Zygote 的启动是由 init.rc 脚本文件拉起来的。由 Android Init Language 编写而成的
  • 这些 zygote 启动脚本都放在 Android 源码的 system/core/rootdir 目录中
//init.rc
import /init.${ro.zygote}.rc

在 init.rc 中,启动 Zygote 并不是直接将启动的文件写死,而是根据 ro.zygote 的属性值来决定导入哪个版本的文件。
ro.zygote 取值有 4 种,也就意味着 Zygote 支持 4 种版本

init.zygote32.rc
init.zygote32_64.rc
init.zygote64.rc
init.zygote64_32.rc

init.zygote32.rc

只支持 32 bit 应用程序

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
    class main
    priority -20
    user root
    group root readproc reserved_disk
    socket zygote stream 660 root system
    # onrestart write /sys/android_power/request_state wake
    # onrestart write /sys/power/state on
    # onrestart restart audioserver
    # onrestart restart cameraserver
    # onrestart restart media
    onrestart restart netd
    onrestart restart wificond
    writepid /dev/cpuset/foreground/tasks
  • 根据 Service 类型语句的格式,得知函数名为 zygote,执行程序路径为 /system/bin/app_process/,类名为 main

init.zygote32_64.rc

表示既支持 32 bit,又支持 64 bit 应用程序

service zygote /system/bin/app_process32 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote
    class main
    priority -20
    user root
    group root readproc reserved_disk
    socket zygote stream 660 root system
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart audioserver
    onrestart restart cameraserver
    onrestart restart media
    onrestart restart netd
    onrestart restart wificond
    writepid /dev/cpuset/foreground/tasks

service zygote_secondary /system/bin/app_process64 -Xzygote /system/bin --zygote --socket-name=zygote_secondary
    class main
    priority -20
    user root
    group root readproc reserved_disk
    socket zygote_secondary stream 660 root system
    onrestart restart zygote
    writepid /dev/cpuset/foreground/tasks
  • 脚本会启动两个 Service,也就说会启动两个 Zygote 进程,一个名称叫 zygote,执行程序路径为 /system/bin/app_process32,作为主模式,另一个是 zygote_secondary,执行程序路径为 /system/bin/app_process64,作为辅模式

init.zygote64.rc 和 init.zygote64_32.rc

与上两个脚本类似,不在赘述

Zygote 启动过程

main() 函数

脚本启动 Zygote 后首先执行 frameworks/base/cmds/app_process/app_main.cpp/main() 中的代码

image

  • main 会启动 zygote,systemserver 和 application 三种类型的进程。根据传入的参数区别去启动不同类型的进程。
  • 启动进程的方法是使用 AppRuntime 类去调用 AndroidRuntime 启动 Android 进程。

AndroidRuntime.cpp

  • 该文件位于 frameworks/base/core/ 文件夹中
  • 该文件是用于启动 Android 服务的,包括 Zygote,SystemServer,application 等

image

ZygoteInit.java

  • ZygoteInit.java 文件位于 /frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
  • ZygoteInit的main方法主要做了4件事:
    1. 创建一个Server端的Socket。
    2. 预加载类和资源。
    3. 启动SystemServer进程。
    4. 等待AMS请求创建新的应用程序进程。

image

Zygote 进程总结

  1. 创建一个 AppRuntime 并调用其 start 方法,启动 Zygote 进程
  2. 创建 Java 虚拟机,并为 Java 虚拟机注册 JNI 方法
  3. 通过 JNI 调用 ZygoteInit 的 main() 函数进入 Zygote 的 Java 框架层
  4. 通过 registerZygoteSocket() 创建服务端 Socket,并通过 runSelectLoop() 方法等待 AMS 请求创建新的应用进程
  5. 启动 SystemServer 进程
posted @ 2024-03-27 14:02  王清河  阅读(254)  评论(0编辑  收藏  举报