系统初始化以及Zygote进程fork app进程的基础

系统初始化以及Zygote进程fork app进程的基础

1.安卓系统启动分析

当我们按下安卓设备的电源按钮时,一个经过精心设计的启动流程开始了。这个流程由多个关键步骤组成,其目标是将系统从关机状态启动到正常运行状态。在本文中,我们将详细介绍安卓系统的启动流程。

1. 启动电源以及系统启动

当电源被启动时,引导芯片载入了预定义的引导程序(固化在 ROM 中),并将引导程序 BootLoader 加载到 RAM 中开始执行。

2. 引导程序 BootLoader

BootLoader 是一个小程序,其主要作用是引导安卓系统,并将其运行起来。

3. Linux 内核启动

在内核启动时,系统设置了缓存、保护存储器、调度列表,并加载了各种驱动。完成系统设置后,内核会搜索 init.rc 文件,并启动 init 进程。

4. init 进程启动

init 进程是系统启动时的第一个用户空间进程。它完成了许多重要的初始化工作,包括 1. 创建和挂载启动所需的文件目录、2. 初始化和启动属性服务,以及 3. 启动 Zygote 进程。

下面详细说明三个重要的步骤:

创建和挂载启动所需的文件目录:

在系统启动过程中,init 进程首先会创建和挂载所需的文件目录,这些目录包括根目录、/proc、/sys 等,以确保系统能够正常运行和提供所需的资源和环境。

初始化和启动属性服务:

Android 系统中的属性服务用于存储系统的属性信息,这些信息可以用于配置系统的行为和特性。init 进程在启动时会初始化并启动属性服务,这确保了系统能够根据需要正确配置自身,并提供正确的服务。

解析 init.rc 配置文件并启动 Zygote 进程:

init 进程会解析 init.rc 配置文件,该文件描述了系统在启动时需要进行的各种操作,包括启动系统服务、挂载文件系统等。其中,init.rc 文件中的一项重要任务是启动 Zygote 进程。Zygote 进程是 Android 系统中的一个重要进程,它是所有应用程序的起点,任何新应用程序的进程都是由 Zygote 进程来孵化和启动的。

5. Zygote 进程启动

Zygote 进程是 Android 系统的关键进程,其主要工作包括创建 Java 虚拟机并为其注册 JNI 方法,创建服务器端 Socket 以便接收请求,并启动 SystemServer 进程。

Zygote 进程的启动过程涉及了一系列关键步骤,这些步骤为 Android 应用程序的快速启动和运行奠定了基础。

init 启动 zygote 时主要是调用 app_main.cpp 的 main 函数中的 AppRuntime 的 start 方法来启动 zygote 进程,AppRuntime 负责管理应用程序的运行环境,包括应用程序的启动和生命周期管理。通过调用 start 方法,Zygote 进程开始正式启动,为后续应用程序的启动和运行做好准备。

创建 Java 虚拟机并为 Java 虚拟机注入 JNI 方法:

作为 Android 应用程序的基石,Java 虚拟机(JVM)是整个 Android 系统的核心组成部分。在 Zygote 启动过程中,会创建 Java 虚拟机,并为其注入 JNI(Java Native Interface)方法,这些方法用于实现 Java 与本地代码(C/C++)的互操作。通过这一步骤,Zygote 为后续应用程序提供了 Java 运行环境的支持。

通过 JNI 调用 ZygoteInit 的 main 函数进入 Zygote 的 Java 框架层:

通过 JNI 调用 ZygoteInit 的 main 函数,Zygote 进程进入其 Java 框架层。ZygoteInit 负责系统服务和应用进程的启动,它负责在应用程序启动时进行一系列初始化操作,为新应用程序的进程创建做好准备。

通过 registerZygoteSocket 方法创建服务器端 Socket,并通过 runSelectLoop 方法等待 AMS 的请求来创建新的应用程序进程:

Zygote 进程通过 registerZygoteSocket 方法创建服务器端 Socket,这允许 ActivityManagerService(AMS)向 Zygote 进程发送请求,请求创建新的应用程序进程。随后,Zygote 进程通过 runSelectLoop 方法等待 AMS 的请求,一旦收到请求,就会创建新的应用程序进程,从而实现应用程序的快速启动。

当 Zygote 进程完成前述步骤后,其接下来的工作便是启动 SystemServer 进程。SystemServer 是 Android 系统中一个非常重要的进程,负责启动并管理系统的各项核心服务。

6. SystemServer 进程启动

SystemServer 是 Android 系统中的一个重要进程,负责启动并管理系统的各项核心服务。它负责启动 Binder 线程池和 SystemServiceManager,并启动各种系统服务。

详细来说启动通常包括以下几个主要步骤:

创建 SystemServer 实例: Zygote 进程在启动 SystemServer 之前会创建 SystemServer 的实例。

调用 SystemServer 的 main 方法: Zygote 进程通过调用 SystemServer 实例的 main 方法来启动 SystemServer 进程。

初始化系统服务: SystemServer 进程在启动时会初始化各种系统服务,包括但不限于包管理器(PackageManagerService)、窗口管理器(WindowManagerService)、通知管理器(NotificationManagerService)、ActivityManager 等。

注册核心系统服务: SystemServer 进程负责注册核心的系统服务,以便其他应用程序或组件可以与这些服务进行通信和交互。

启动其他关键进程: 除了系统服务外,SystemServer 进程还可能启动其他重要的系统组件和进程,例如安全性相关的服务或者底层系统管理进程。

通过这些步骤,SystemServer 进程在 Android 系统启动过程中扮演着至关重要的角色。它的启动是 Android 系统初始化过程中的最后一步,确保系统各项核心服务的正常运行,并为后续应用程序和用户体验提供了强大的基础支持。

7. Launcher 启动

SystemServer 进程启动后,会启动 ActivityManagerService(AMS),并由 AMS 启动 Launcher。Launcher 负责将已安装的应用程序的快捷图标显示到用户界面上,使用户可以轻松访问和启动应用程序。

通过这一系列的步骤,安卓系统完成了从启动到正常运行的整个过程。每个步骤都是系统正常运行的关键组成部分,确保了系统在启动后能够顺利运行,并为用户提供无缝的使用体验。这个复杂而又精妙的启动流程是安卓系统高效运行的基础,也是我们每天使用安卓设备时很少关注却随时在发挥作用的重要环节。

2.Zygote fork

1.创建虚拟机startVM()

2.注册JNI方法:startReg()

app native的调用

当上层(java)调用function()

​ |

翻译 JNI:jni_function()--对c++代码进行封装理解,枚举方式注册所有允许被java层使用的native的开放接口

​ |

​ c+±-function()

zygote app都能够去访问底层代码

3.env->CallStaticVoidMethod()使用JNI调用ZygoteInit的main函数,进入java世界

基础:反射

并且通过**preload()**方法(预加载)所有基础的java类(act)各种基础控件、资源等等

fork的过程类似细胞分裂,zygote翻译就是受精卵,非常形象的解释了fork的过程

zygote中有一个class1,fork出的两个进程一样会带有

这就是为什么所有fork出来的app为什么不需要导入依赖就可以创建Viewtext,act这些基础内容

context:之前学安卓开发的时候一直感觉这个context的作用很关键,在各种情景都会需要context包括创建各种view,act,广播各种都出现他但是始终不清楚context是什么,今天学到这里懂了,只要我们开发过程中,涉及到与android的提供的源码相关的这些工具类都会用到上下文,context就是代表着在preload过程中加载的这些基础资源。

相关推荐
顾林海23 天前
Android 性能优化:启动优化全解析
android·java·面试·性能优化·zygote
帅得不敢出门3 个月前
Android Framework学习三:zygote剖析
android·java·学习·framework·安卓·zygote
王景程5 个月前
Android Zygote的进程机制
android·github·模块测试·zygote
gary_qing8 个月前
Zygote启动流程(AndroidV)
android·zygote
猿小蔡-Cool9 个月前
Android 中的 Zygote 和 Copy-on-Write 机制详解
android·zygote
zhangjin11201 年前
从AMS与Zygote通信理解Android系统的启动过程
android·linux·zygote
彬_小彬1 年前
浅谈对Zygote理解
zygote
清霜之辰1 年前
安卓14中Zygote初始化流程及源码分析
android·zygote
qfh-coder1 年前
Android framework的Zygote源码分析
android·zygote