当前位置: 首页 > news >正文

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 系统的启动和应用进程管理至关重要。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Redis】哨兵(sentinel)
  • 利用AI辅助制作ppt封面
  • 访问 Postman OAuth 2.0 授权的最佳实践
  • git常用命令及git分支
  • 服务器操作集合
  • 【postgresql】锁
  • 【权威发布】2024年互联网技术与信息工程国际会议(ITIEIC 2024)
  • 流媒体服务器(21)—— mediasoup 之媒体流score评分计算(二)
  • 五分钟搞懂 : 和 :: 的区别
  • MySQL 分库分表
  • CSS选择器(1)
  • 【Linux信号】信号的保存、信号在内核中的表示、信号集操作函数、sigprocmask、sigpending
  • PYTHON自学笔记(二)查漏补缺
  • JVM参数调优经验
  • 自己动手写一个滑动验证码组件(后端为Spring Boot项目)
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • Bootstrap JS插件Alert源码分析
  • es6
  • ES6核心特性
  • JavaScript设计模式系列一:工厂模式
  • js数组之filter
  • JS题目及答案整理
  • Mocha测试初探
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Python利用正则抓取网页内容保存到本地
  • Python中eval与exec的使用及区别
  • Zepto.js源码学习之二
  • 从重复到重用
  • 工作中总结前端开发流程--vue项目
  • 回顾2016
  • 深度学习在携程攻略社区的应用
  • 算法系列——算法入门之递归分而治之思想的实现
  • 小程序开发之路(一)
  • 走向全栈之MongoDB的使用
  • Java性能优化之JVM GC(垃圾回收机制)
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #### go map 底层结构 ####
  • #define 用法
  • #include<初见C语言之指针(5)>
  • #pragma multi_compile #pragma shader_feature
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (JS基础)String 类型
  • (不用互三)AI绘画工具应该如何选择
  • (二)原生js案例之数码时钟计时
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (六)DockerCompose安装与配置
  • (生成器)yield与(迭代器)generator
  • (十三)MipMap
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (转)scrum常见工具列表