1.3Zygote

Zygote 是 Android 系统中一个关键的进程,负责快速创建新应用进程。它的名字来源于生物学中的“合子”,象征着它是所有应用进程的起源。以下是对 Zygote 的详细解析:

Zygote 的作用

  1. 预加载

    • Zygote 在系统启动时预加载了一些常用的类和资源,包括核心库和框架库。这样可以避免每次启动新应用时重复加载这些资源,从而加快启动速度。
  2. 进程创建

    • Zygote 使用 fork() 系统调用来创建新的应用进程。新进程继承了 Zygote 进程的内存空间,这种方式效率很高,因为内存页是共享的,只有在写时才进行复制(即写时复制,Copy-On-Write)。

Zygote 启动过程

  1. 启动 Zygote 进程

    • Zygote 进程由 init 进程启动,通常在 init.rc 文件中定义:
      service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-serverclass mainonrestart write /sys/android_power/request_state wakeonrestart write /sys/power/state ononrestart restart mediaonrestart restart netd
      
  2. Zygote 启动脚本

    • init 进程启动 app_process 可执行文件,并传递参数使其以 Zygote 模式运行。
    • app_process 会调用 com.android.internal.os.ZygoteInit 类的 main 方法。
  3. Zygote 初始化

    • ZygoteInit.main 方法中,Zygote 进行了一系列初始化工作,包括:
      • 设置内存和线程参数。
      • 创建 UNIX 域套接字,用于接受新进程请求。
      • 预加载类和资源。
      • 启动 SystemServer 进程。

SystemServer 进程

SystemServer 是 Android 系统的另一个关键进程,由 Zygote 创建并启动。它负责启动和管理核心系统服务,例如 Activity Manager、Window Manager 和 Package Manager。

  1. 启动 SystemServer

    • 在 Zygote 初始化过程中,通过 startSystemServer 方法启动 SystemServer。
    • startSystemServer 方法调用 forkSystemServer 创建新进程,并执行 com.android.server.SystemServer 类的 main 方法。
  2. SystemServer 初始化

    • SystemServer.main 方法启动后,会执行一系列初始化操作,包括:
      • 启动 Binder 线程池,用于进程间通信。
      • 启动各种系统服务,例如电源管理服务、包管理服务、窗口管理服务等。

新应用进程的创建

当用户启动一个新的应用时,Activity Manager Service 会向 Zygote 发送请求。Zygote 接收到请求后,通过以下步骤创建新进程:

  1. 接收请求

    • Zygote 通过之前创建的 UNIX 域套接字接收 Activity Manager Service 的进程创建请求。
  2. fork 新进程

    • Zygote 调用 fork() 系统调用创建新进程。
    • 新进程继承了 Zygote 进程的内存空间,但之后会执行应用自己的代码。
  3. 初始化新进程

    • 新进程会调用 ActivityThread.main 方法进行初始化,加载应用的资源和类,并启动主线程。

总结

Zygote 是 Android 系统中用于创建应用进程的关键组件。通过预加载常用类和资源,并使用 fork() 系统调用,Zygote 能够高效地创建新进程。它不仅提高了应用启动速度,还通过共享内存页减少了系统资源的消耗。了解 Zygote 的工作原理对于深入理解 Android 系统的启动和应用进程管理至关重要。

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

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

相关文章

JAVA零基础学习1(CMD、JDK、环境变量、变量和键盘键入、IDEA)

JAVA零基础学习1(CMD、JDK、环境变量、变量和键盘键入、IDEA) CMD常见命令配置环境变量JDK的下载和安装变量变量的声明和初始化声明变量初始化变量 变量的类型变量的作用域变量命名规则示例代码 键盘键入使用 Scanner 类读取输入步骤示例代码 常用方法处…

HBuilder X3.4版本中使用uni-app自定义组件

HBuilder X3.4版本中使用uni-app自定义组件 这是我的小程序页面结构 方式一&#xff1a;导入components 1.创建componets文件&#xff0c;并编写你的组件页面 <template><view class"my-search-container"><!-- 使用 view 组件模拟 input 输入框的样…

无人机区域常见名词

融合空域 是指有其他航空器同时运行的空域。 隔离空域 是指专门分配给无人机系统运行的空域&#xff0c;通过限制其他航空器的进入以规避碰撞风险。 人口稠密区 是指城镇、村庄、繁忙道路或大型露天集会场所等区域。 重点地区 是指军事重地、核电站和行政中心等关乎国家…

前端学习常用技术栈

前端基础&#xff1a;HTML、CSS、JavaScript 前端高级&#xff1a;HTML5、CSS3、JavaScript 语法规范&#xff1a;TypeScript、ECMAScrpit、Eslint、Prettier 前端热门框架&#xff1a;Vue.js、React.js、Angular.js、Bootstrap、Nuxt.js、Svelte.js、Solid.js、Preact.js、Tai…

LintcCode 468 · 对称二叉树【简单 二叉树 递归 Java】

题目 题目链接&#xff1a; https://www.lintcode.com/problem/468/description?showListFetrue&page1&problemTypeId2&tagIds371&orderingid&pageSize50 思路 递归 Java代码 /*** Definition of TreeNode:* public class TreeNode {* public int…

厂家置换电费如何达到最大化收益

新能源行业知识体系-------主目录-----持续更新https://blog.csdn.net/grd_java/article/details/140004020 文章目录 一、电能电费二、同时刻不同厂家置换&#xff0c;不会影响最终电能电费结果三、风险防范补偿和回收机制四、我们的数据如何考虑补偿和回收五、如何利用补偿和…

蓝桥杯14小白月赛题解

直接输出pi/ti,for遍历 #include <iostream> using namespace std; #define int long long int a,b,c ; double t1.00; signed main() {cin>>a;int an0;for(int i1;i<a;i){cin>>b>>c;if(t>c*1.00/b){tc*1.00/b;ani;} }cout<<an<<e…

服务器上有多个nginx,如何知道启动的是哪个?

根据网上查的方案和自己总结的目前是有三种 方案1&#xff1a;链接: 服务器上有多个nginx&#xff0c;如何知道启动的是哪个&#xff1f; 首先ps -ef | grep nginx&#xff0c;获取个pid lsof -p pid&#xff0c;根据输出可以看到启动这个pid的路径&#xff0c;即可知道是哪个…

【车载开发系列】GIT教程---如何使用GUI来提交变更

【车载开发系列】GIT教程—如何使用GUI来提交变更 GIT教程---如何使用GUI来提交变更 【车载开发系列】GIT教程---如何使用GUI来提交变更一. 使用Git GUI的好处二. 使用GUI克隆出一个已有仓库 一. 使用Git GUI的好处 在软件开发中&#xff0c;Git通常用于管理和操作版本控制系统…

linux-arm ubuntu18.04 qmqtt5.12.6 编译部署

安装 qt 查看qt 版本 &#xff1a; qmake -v 下载对应版本 qmqtt 解压下载的mqtt文件 进入qmqtt xxx/src 目录 在qt 安装目录中创建QtMqtt文件夹&#xff0c; &#xff0d; x86平台qt 默认目录为 /usr/include/x86_64-linux-gnu/qt5 &#xff0d; arm平台qt 默认目录为/us…

Python 从PDF中提取图片和图片信息(坐标、宽度和高度等)

目录 使用工具 Python从PDF的特定页面中提取图片 Python从PDF文档中提取图片 Python从PDF中提取图片的坐标、宽度和高度等信息 PDF文件作为一种广泛使用的电子文档格式&#xff0c;不仅包含文字信息&#xff0c;还可能包含各种图片、图表等视觉元素。在某些场景下&#xff…

【Linux】安装PHP扩展-Swoole

说明 本文档是在centos7.6的环境下&#xff0c;安装PHP7.4之后&#xff0c;安装对应的PHP扩展Swoole。 一、swoole简述 Swoole 是一个为 PHP 设计的高性能的异步并行网络通信引擎&#xff0c;它以扩展&#xff08;extension&#xff09;的形式存在&#xff0c;极大地提升了 …

zephyr设置BLE广播数据实例

目录 实例1&#xff1a;静态开启广播数据实例2&#xff1a;动态更改广播数据实例3&#xff1a;创建可连接的广播 实例1&#xff1a;静态开启广播数据 新建一个hello world的工程模板。 在prj.conf中开启蓝牙 CONFIG_BTy这个宏&#xff0c;默认会开启广播支持 ( BT_BROADCAS…

Spring Boot项目的404是如何发生的

问题 在日常开发中&#xff0c;假如我们访问一个Sping容器中并不存在的路径&#xff0c;通常会返回404的报错&#xff0c;具体原因是什么呢&#xff1f; 结论 错误的访问会调用两次DispatcherServlet&#xff1a;第一次调用无法找到对应路径时&#xff0c;会给Response设置一个…

TCP与UDP的理解

文章目录 UDP协议UDP协议的特点UDP的应用以及杂项 TCP协议TCP协议段格式解释和TCP过程详解确认应答机制 -- 序号和确认序号以及6位标志位中的ACK超时重传机制连接管理机制 与标志位SYN,FIN,ACK滑动窗口流量控制拥塞控制延迟应答捎带应答和面向字节流粘包问题TCP异常情况TCP特点…

5.4 软件工程-系统设计

系统设计 - 概述 设计软件系统总体结构 数据结构及数据库设计 编写概要设计文档、评审 详细设计的基本任务 真题

【LeetCode】插入区间

目录 一、题目二、解法完整代码 一、题目 给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表 intervals&#xff0c;其中 intervals[i] [starti, endi] 表示第 i 个区间的开始和结束&#xff0c;并且 intervals 按照 starti 升序排列。同样给定一个区间 newInte…

前端打包部署后源码安全问题总结

随着现代Web应用越来越依赖于客户端技术&#xff0c;前端安全问题也随之突显。源码泄露是一个严重的安全问题&#xff0c;它不仅暴露了应用的内部逻辑和业务关键信息&#xff0c;还可能导致更广泛的安全风险。本文将详细介绍源码泄露的潜在风险&#xff0c;并提供一系列策略和工…

比特币中的挖矿到底是什么意思

在比特币挖矿过程中&#xff0c;计算的核心是解决一个称为"工作量证明"&#xff08;Proof of Work, PoW&#xff09;的数学难题。这个难题是设计来需要大量计算资源才能解决的&#xff0c;但验证其解却相对容易。以下是解决这个难题的具体步骤和原理&#xff1a; 工…

anaconda常用指令学习

在win系统下安装完成后&#xff0c;需要进行环境变量的配置 配置环境变量&#xff0c;把下面的4个目录全部加到PATH变量里面。 Anaconda安装目录的根目录\ Anaconda安装目录的根目录\Scripts Anaconda安装目录的根目录\Library\bin Anaconda安装目录的根目录\Library\mingw-w6…