对zygote的理解

news2024/11/27 2:34:07

一、 zygote的作用

    1. 启动SystemServer
      SystemServer需要用于zygote准备好的一些系统资源,比如常用类、注册的JNI函数、主题资源、共享库等等,直接从zygote那继承过来,SystemServer就不用重新再加载一遍,这样对性能有很大的提升。
    1. 孵化应用进程

在这里插入图片描述
Loop循环就是不停的接收消息,处理消息;处理的消息可以能messageQueue里面的消息,也可能是binder驱动那边传过来的。

二、Zygote的启动流程

1. zygote进程是怎么启动的
Init进程为Linux启动后用户空间的第一个进程,Init进程启动之后,首先会加载init.rc启动配置文件,然后会查看启动配置文件定义了哪些系统服务需要启动的,zygote就是要启动的服务之一,通过fork + execve 进行启动zygote进程
启动zygote进程相关的配置:
在这里插入图片描述
第一行命令语句说明:

  • 红色部分zygote: 表示service的名称
  • 蓝色部分/system/bin/app_process:表示zygote程序路径
  • 黄色部分-Xzygote /system/bin --zygote --start-system-server: 表示程序执行的参数
  • Xzygote:作为虚拟机启动时所需要的参数,在AndroidRuntime.cpp中的 startVm() 函数中调用 JNI_CreateJavaVM 使用到
  • /system/bin:代表虚拟机程序所在目录,因为 app_process 可以不和虚拟机在一个目录,所以 app_process 需要知道虚拟机所在的目录
  • -zygote:指明以 ZygoteInit 类作为入口,否则需要指定需要执行的类名
  • –start-system-server:仅在有 --zygote 参数时可用,告知 ZygoteInit 启动完毕后孵化出的第一个进程是 SystemServer
  • 其他命令:后续的命令是和socket相关,名称、类型、端口号、重启后的操作等等

** 启动进程**
(1) fork + handle

pid_t pid =fork();
if (pid == 0) {
	// child process
} else {
	// parent process
}

(2) fork + execve

pid_t pid =fork();
if (pid == 0) {
	// child process
	execve(path, argv, env);
} else {
	// parent process
}

2. Zygote进程启动之后做了什么?

  • Zygote的Native世界
    (1)启动Android虚拟机
    (2)注册Android的JNI函数
    (3)进入Java世界
    在这里插入图片描述

  • Zygote的Java世界
    (1)预加载资源 Proload Resources,比如常用类、主题资源、共享库等
    (2)启动System Server(单独运行在一个进程中)
    (3)LOOP循环
    在这里插入图片描述

boolean runOnce() {
	String[] args = readArgumentList();  //读取参数列表
	int pid = Zygote.forkAndSpecialize(); //启动子进程
	if (pid == 0) {
		// in child 
		handleChildProc(args, ...);  //在子进程中进行相应的工作,执行该语句之后会执行ActivityThread.man()函数
		return true;
	}
}

要注意的细节

  • Zygote 进行fork的时候要单线程,为了避免造成死锁或者状态不一致等问题
  • Zygote的IPC(跨进程通信)没有采用binder,采用的是本地socket通信

问题: 谈谈你对zygote的理解?
What:zygote的作用是什么?
答:(1)启动System server进程,是用于管理整个Java framework层,包含ActivityManager,PowerManager等各种系统服务;
(2)孵化其他应用程序进程

How:zygote的启动流程是什么?
答:Zygote进程是由Init进程解析init.zygote.rc文件启动的,zygote所对应的可执行程序app_process,所对应的源文件是App_main.cpp,进程名为zygote。

首先执行App_main.cpp的main()函数,在这里会执行以下步骤:

1.解析命令参数,主要是–zygote 和–start-system-server。

2.调用AppRuntime.start(“com.android.internal.os.ZygoteInit”,…),启动虚拟机,注册JNI函数;

3.通过JNI调用ZygoteInit.java的main()方法,从这里开始进入Java的世界;

运行Zygote的main方法,主要执行以下步骤:

预加载 preloadClasses()、preloadResources()、preloadSharedLibraries()
forkSystemServer,最终会调用SystemServer.java的main()方法;
创建ZygoteService,进入runSelectLoop;

zygote的启动流程简单说明:
1)创建Java虚拟机;
2)为Java虚拟机注册native方法;
3)在com.android.internal.os.ZygoteInit中调用java类的主要方法;
4)加载ZygoteInit class;
5)注册zygote socket;
6)加载preload class;
7)加载preload 资源文件;
8)调用Zygote::forkSystemServer,fork一个新的进程,调用SystemServer的main方法,从而进入到java层的system_server进程的初始化流程中;

Why:zygote的工作原理是什么?(如何孵化进程以及如何进行通信)

问题1:孵化应用进程这种事为什么不交给SystemServer来做,而专门设计一个Zygote?
答:我们知道,应用在启动的时候需要做很多准备工作,包括启动虚拟机,加载各类系统资源等等,这些都是非常耗时的,如果能在zygote里就给这些必要的初始化工作做好,子进程在fork的时候就能直接共享,那么这样的话效率就会非常高。这个就是zygote存在的价值,这一点呢SystemServer是替代不了的,主要是因为SystemServer里跑了一堆系统服务,这些是不能继承到应用进程的。所以给SystemServer和应用进程里都要用到的资源抽出来单独放在一个进程里,也就是这的zygote进程,然后zygote进程再分别孵化出SystemServer进程和应用进程。

问题2: Zygote的IPC通信机制为什么使用socket而不采用binder?
答:主要原因是因为Zygote进行fork的时候要是单线程,父进程binder线程有锁,然后子进程的主线程一直在等其子线程(从父进程拷贝过来的子进程)的资源,但是其实父进程的子进程并没有被拷贝过来,造成死锁,所以fork不允许存在多线程。而非常巧的是Binder通讯偏偏就是多线程,所以干脆父进程(Zygote)这个时候就不使用binder线程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/27280.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CRM系统中联系人管理的十大好处

联系人管理通常是你的CRM策略中的一个关键部分。它是存储和组织联系人数据以便于访问的做法。简而言之,就是管理联系人数据的过程。如今联系人管理已内置到 CRM 系统中。因此,我们可以考虑利用系统软件将以下优点应用于联系人管理中。 1、更好、更持久的…

Matplotlib用法使用、Matplotlib绘图作图画图

一、Matplotlib Matplotlib:专门用于开发2D或3D图表,以渐进、交互式方式实现数据可视化 可视化是在整个数据挖掘的关键辅助工具,可以清晰的理解数据,从而调整我们的分析方法 能将数据进行可视化,更直观的呈现使数据…

希望所有计算机学生能看到这篇c语言教程

大部分程序员走入编程世界第一个学习的语言就是C语言。 作为一门古老的编程语言,c语言拥有48年的发展历程。 为什么要学习 C语言? C语言是学习计算机程序设计语言的入门语言。C语言是一门偏底层的语言,学好它,可以让你更好的了…

E - Fire! (双向bfs)

UVA-11624-Fire! 题意:在n*m的网格内,有一个人和n堆火,人可以往上下左右四个方向走,同时所有的火也会想四周蔓延,问你人可不可以在火包围他之前逃离这个n*m的范围。 思路:问人可不可以逃离这个范围&#xf…

m基于VDLL的矢量型GPS信号跟踪算法matlab仿真

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 载波跟踪环是传统独立式GPS接收机最脆弱的环节,针对弱信号环境下其比伪码跟踪环路更容易失锁的问题,给出一种基于矢量频率锁定环(vector-frequency lo…

集成学习-Boosting

Boosting 采用串行的方式训练,各基分类器之间有依赖。根据当前模型损失函数的负梯度训练新的弱分类器,将训练好的弱分类器以累加的形式结合到现有模型中。 过程中会不断减小损失函数,使模型偏差不断降低,方差不会降低。因为各弱分…

《CTFshow - Web入门》02. Web 11~20

Web 11~20web11知识点题解web12知识点题解web13知识点题解web14知识点题解web15知识点题解web16知识点题解web17知识点题解web18知识点题解web19知识点题解web20知识点题解web11 知识点 dns检查查询:http://dbcha.com/,输入域名,获取flag。…

MySQL数据库期末考试试题及参考答案(07)

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 一、 填空题 如果不想提交当前事务,可以使用_____语句回滚事务。每个事务都是完整不可分割的最小单元是事务的_____性。MySQL中,显式开启事务的语句…

屏幕视频捕获组件-ByteScout Screen Capturing SDK

使用 ByteScout Screen Capturing SDK,您可以轻松地将屏幕视频捕获功能添加到您的应用程序中。输出带有音频、鼠标移动和点击的高质量桌面屏幕视频录制。 主要优势 只需几行代码即可在您的应用中启用屏幕视频捕获和屏幕录制功能;无需互联网连接即可离线…

Django day1

在windows下可以直接的创建django项目 但是需要把自动生成的templates和setting里面的DIRS里面字段删除(templates自动生成的可以删不删都行,我是看视频那个老师删了,但是setting DIRS里面的字段需要删,至于具体为啥我已经忘了&am…

TiDB数据库概述——PD

PD PD的架构与功能TSO的分配PD的调度原理label的作用 PD的架构 PD的个数一般是奇数个的。 PD的主要功能: 整个集群TiKV的元数据存储分配全局ID和事务ID生成全局时间戳TSO收集群信息进行调度提供label,支持高可用提供TiDB Dashboard 路由功能 用key…

vue3使用富文本编辑器wangEditor-v5(未使用composition api写法)

效果 安装 安装核心库和其vue组件库 yarn add wangeditor/editor yarn add wangeditor/editor-for-vuenext使用v-model封装富文本组件editor.vue <template><div class"editor-box"><Toolbar class"toolbar" :editor"editor" …

Flink是什么?场景?处理流的发展演变?

Flink是什么&#xff1f;Flink是什么&#xff1f;为什么选择Flink&#xff1f;什么场景需要处理流数据?处理流的发展演变Flink是什么&#xff1f; Apache Flink 是一个在无界和有界数据流上进行状态计算的框架和分布式处理引擎。Flink 能在所有常见集群环境中运行&#xff0c…

线性表的链式存储的基本

链表是线性表的链式存储方式&#xff0c;逻辑上相邻的数据在计算机内的存储位置不一定相邻&#xff0c;因此&#xff0c;我们需要为每一个元素设置有一个指针来指向与它逻辑相邻的元素。 为此&#xff0c;我们为每个元素设置一个结点&#xff0c;每个结点由数据域和指针域组成…

【3D目标检测】Monocular 3D Object Detection with Pseudo-LiDAR Point Cloud

目录概述整体流程伪点云vs点云2D-3D边界框的一致性约束概述 本文的输入数据仅仅是单目图像&#xff0c;在方法上是融合了伪点云&#xff08;Pseudo-LiDAR&#xff09;的深度信息表示方法与Frustum PointNets的检测方法。 乍一看文章和伪点云原论文Pseudo-LiDAR from Visual De…

Deep-SVDD 方法

两种情况 1. 数据集有正负样本&#xff0c;但正样本的量远远大于负样本为异常检测&#xff0c;即大量的正样本为正常&#xff0c;少数的负样本是异常的。 2. 数据集只有正样本&#xff0c;称为单分类&#xff0c;即只通过正样本训练模型&#xff0c;区分正样本和非正样本。 情…

蓝桥杯2021年第十二届省赛真题-时间显示(C and C++)

这一篇是个小记&#xff0c;真无语了&#xff0c;看见这个题感觉哇塞好简单的感觉&#xff0c;谁知道栽了&#xff0c;烦死了 话不多说&#xff0c;记录一下 C语言 #include<stdio.h> int main() {int a,b,c;long long time;//题上说了10的18次方的正整数&#xff0c;所…

Spring:AOP的五种通知类型(12)

AOP的五种通知类型前置通知&#xff1a;Before注解后置通知&#xff1a;After注解环绕通知&#xff1a;Around注解&#xff08;掌握&#xff09;返回后通知&#xff1a;AfterReturning&#xff08;了解&#xff09;异常后通知&#xff1a;AfterThrowing&#xff08;了解&#x…

直播回顾 | 【原引擎】解密云原生安全:如何应对新型BOT攻击?

BOT流量是指在互联网上对Web网站、APP应用、API接口通过工具脚本、爬虫程序或模拟器等非人工手动操作访问的自动化程序流量&#xff0c;一般也称为机器人流量。而恶意的BOT流量通过利用代理或秒拨IP、手机群控等手段来爬取信息数据、抢刷接口、薅羊毛、外挂作弊等恶意攻击行为&…

招标 | 近期隐私计算项目招标中标25(大连理工大学、中国电信北京研究院、松山湖材料实验室、北京控制工程研究所、光大永明)

开放隐私计算 开放隐私计算 开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播&#xff0c;愿成为中国 “隐私计算最后一公里的服务区”。 177篇原创内容 …