查看原文
其他

Android 10.0系统启动之Zygote进程(一)-「Android取经之路」

IngresGe IngresGe 2021-11-05

前几节已经讲完了Android10.0的Init启动过程。

Android取经之路——启动篇

Android系统架构-[Android取经之路]

Android是怎么启动的-[Android取经之路]

Android系统启动之init进程(一)-「Android取经之路」

Android系统启动之init进程(二)-「Android取经之路」

Android 10.0系统启动之init进程(三)-「Android取经之路」

Android 10.0系统启动之init进程(四)-「Android取经之路」


这一节主要来讲解Android10.0 的Zygote进程启动流程。

1.概述

上一节讲解了InIt进程的整个启动流程。Init进程启动后,最重要的一个进程就是Zygote进程,Zygote是所有应用的鼻祖。SystemServer和其他所有Dalivik虚拟机进程都是由Zygote fork而来。

Zygote进程由app_process启动,Zygote是一个C/S模型,Zygote进程作为服务端,其他进程作为客户端向它发出“孵化-fork”请求,而Zygote接收到这个请求后就“孵化-fork”出一个新的进程。

由于Zygote进程在启动时会创建Java虚拟机,因此通过fork而创建的应用程序进程和SystemServer进程可以在内部获取一个Java虚拟机的实例拷贝。

2.核心源码

/system/core/rootdir/init.rc/system/core/init/main.cpp/system/core/init/init.cpp/system/core/rootdir/init.zygote64_32.rc/frameworks/base/cmds/app_process/app_main.cpp/frameworks/base/core/jni/AndroidRuntime.cpp/libnativehelper/JniInvocation.cpp/frameworks/base/core/java/com/android/internal/os/Zygote.java/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java/frameworks/base/core/java/com/android/internal/os/ZygoteServer.java/frameworks/base/core/java/com/android/internal/os/ZygoteConnection.java/frameworks/base/core/java/com/android/internal/os/RuntimeInit.java/frameworks/base/core/java/android/net/LocalServerSocket.java/system/core/libutils/Threads.cpp

3.架构

3.1 架构图

3.2 Zygote 是如何被启动的

rc解析和进程调用:
Init进程启动后,会解析init.rc文件,然后创建和加载service字段指定的进程。zygote进程就是以这种方式,被init进程加载的。

3.2.1 init.zygote64_32.rc

第一个Zygote进程:

进程名为:zygote

进程通过 /system/bin/app_process64来启动

启动参数:-Xzygote /system/bin --zygote --start-system-server --socket-name=zygote

socket的名称:zygote

service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote class main priority -20 user root //用户为root group root readproc reserved_disk //访问组支持 root readproc reserved_disk socket zygote stream 660 root system //创建一个socket,名字叫zygote,以tcp形式 ,可以在/dev/socket 中看到一个 zygote的socket socket usap_pool_primary stream 660 root system onrestart write /sys/android_power/request_state wake // onrestart
当进程重启时执行后面的命令
onrestart write /sys/power/state on onrestart restart audioserver onrestart restart cameraserver onrestart restart media onrestart restart netd onrestart restart wificond onrestart restart vendor.servicetracker-1-1 writepid /dev/cpuset/foreground/tasks // 创建子进程时,向 /dev/cpuset/foregrou
nd/tasks 写入pid

第二个Zygote进程:zygote_secondary

进程通过 /system/bin/app_process32来启动

启动参数:-Xzygote /system/bin --zygote --socket-name=zygote_secondary --enable-lazy-preload

socket的名称:zygote_secondary

service zygote_secondary /system/bin/app_process32 -Xzygote /system/bin --zygote --socket-name=zygote_secondary --enable-lazy-preload class main priority -20 user root group root readproc reserved_disk socket zygote_secondary stream 660 root system //创建一个socket,名字叫zygote_secondary,以tcp形式 ,可以在/dev/socket 中看到一个 zygote_secondary的socket socket usap_pool_secondary stream 660 root system onrestart restart zygote writepid /dev/cpuset/foreground/tasks

从上面我们可以看出,zygote是通过进程文件 /system/bin/app_process64 和/system/bin/app_process32 来启动的。

对应的代码入口为:frameworks/base/cmds/app_process/app_main.cpp

3.2.2 Zygote进程在什么时候会被重启

Zygote进程重启,主要查看rc文件中有没有 “restart zygote” 这句话。在整个Android系统工程中搜索“restart zygote”,会发现以下文件:

/frameworks/native/services/inputflinger/host/inputflinger.rc 对应进程:inputflinger
/frameworks/native/cmds/servicemanager/servicemanager.rc 对应进程:servicemanager
/frameworks/native/services/surfaceflinger/surfaceflinger.rc 对应进程:surfaceflinger
/system/netd/server/netd.rc 对应进程:netd

通过上面的文件可知,zygote进程能够重启的时机:

  1. inputflinger 进程被杀 (onrestart)

  2. servicemanager 进程被杀 (onrestart)

  3. surfaceflinger 进程被杀 (onrestart)

  4. netd 进程被杀 (onrestart)

  5. zygote进程被杀 (oneshot=false)

  6. system_server进程被杀(waitpid)

3.3 Zygote 启动后做了什么

  1. init进程通过init.zygote64_32.rc来调用/system/bin/app_process64 来启动zygote进程,入口app_main.cpp

  2. 调用AndroidRuntime的startVM()方法创建虚拟机,再调用startReg()注册JNI函数;

  3. 通过JNI方式调用ZygoteInit.main(),第一次进入Java世界;

  4. registerZygoteSocket()建立socket通道,zygote作为通信的服务端,用于响应客户端请求;

  5. preload()预加载通用类、drawable和color资源、openGL以及共享库以及WebView,用于提高app启动效率;

  6. zygote完毕大部分工作,接下来再通过startSystemServer(),fork得力帮手system_server进程,也是上层framework的运行载体。

  7. zygote任务完成,调用runSelectLoop(),随时待命,当接收到请求创建新进程请求时立即唤醒并执行相应工作。

3.4 Zygote启动相关主要函数:

C空间:

[app_main.cpp] main()[AndroidRuntime.cpp] start()[JniInvocation.cpp] Init()[AndroidRuntime.cpp] startVm()[AndroidRuntime.cpp] startReg()[Threads.cpp] androidSetCreateThreadFunc[AndroidRuntime.cpp] register_jni_procs() --> gRegJNI.mProc

Java空间:

[ZygoteInit.java] main() [ZygoteInit.java] preload() [ZygoteServer.java] ZygoteServer [ZygoteInit.java] forkSystemServer [Zygote.java] forkSystemServer [Zygote.java] nativeForkSystemServer [ZygoteServer.java] runSelectLoop

下一节我们会对代码细节进行详细的讲解


: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存