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

Android Framework框架与启动过程初识一

文章目录

  • Android系统框架
  • init
    • 配置文件
    • 关键功能
  • zygote
    • 作用
    • 面试相关

Android系统框架

  1. 框架图
    在这里插入图片描述

  2. Framework分层图
    红色圈中的部分就是Framework部分
    在这里插入图片描述

  3. 启动流程
    在这里插入图片描述

init

init是用户空间的鼻祖

  1. init 进程初始化:init 进程会进行一系列初始化操作,像挂载文件系统、设置系统属性、解析并执行初始化脚本等。
  2. 启动关键服务:init 进程会依据配置文件来启动系统的关键服务,例如 Zygote 进程、SurfaceFlinger 、MediaServer等。这些服务是安卓系统正常运行的基础。

配置文件

init 进程主要通过解析配置文件来确定要执行的操作和启动的服务。在安卓系统中,常见的配置文件有:

  • init.rc:这是最主要的初始化脚本,它定义了系统启动时需要执行的命令和启动的服务。该文件采用了特定的语法来描述服务、动作和属性。
  • init..rc:这是针对特定设备的初始化脚本,用于处理该设备特有的初始化需求。
  • init..rc:这是针对特定主板的初始化脚本,处理主板相关的初始化工作。

关键功能

  • 挂载文件系统:init 进程会挂载根文件系统以及其他必要的文件系统,像 /system、/data 等。
  • 设置系统属性:它会设置一系列系统属性,这些属性可用于控制系统的行为和配置。例如,ro.build.version.sdk 属性表示当前系统的 SDK 版本。
  • 启动服务:init 进程会依据配置文件启动各种系统服务,这些服务包括:
  • Zygote 进程:负责预加载 Java 虚拟机(JVM)和系统资源,为后续创建应用程序进程提供基础。
  • SurfaceFlinger:负责管理和合成系统的图形界面,确保界面的流畅显示。
  • MediaServer:提供媒体播放和录制的服务。
  • 处理信号和事件:init 进程会监听并处理各种信号和事件,比如系统关机、重启等。当接收到相应的信号时,它会执行相应的操作来保证系统的正常关闭或重启。

zygote

zygote是由init进程fork出来的,在Android中,DVM和ART、应用程序进程以及运行系统的关键服务的SyetemService进程都是由Zygote进程来创建的,所以称之为孵化器。
Zygote 进程是 Android 系统中由 init 进程启动的第一个 Java 进程,它运行着一个 Java 虚拟机(JVM)实例,并且预加载了大量的系统资源和类,能够快速创建新的应用程序进程和部分系统服务进程。

  • 加载虚拟机:Zygote 进程启动后,会加载 Dalvik 虚拟机(早期 Android 版本)或者 Android Runtime(ART,从 Android 5.0 开始)。
  • 预加载资源和类:Zygote 会预加载系统资源(如系统类库、字体、图片等)和常用的 Java 类(会有上万个类),这样在创建新进程时可以避免重复加载,提高进程创建的速度。
  • 监听 Socket:Zygote 进程会创建一个 Socket 并监听特定的端口,等待来自系统服务(如 ActivityManagerService–AMS)的请求,以创建新的应用程序进程。
  • SystemServer进程 由 Zygote 创建, SystemServer会创建service, SystemServer 启动的服务可能超过 100 个。
    在这里插入图片描述

作用

  • 提高进程创建速度:由于 Zygote 预加载了系统资源和类,新进程可以通过复制 Zygote 进程快速创建,避免了每次创建进程时都要重新加载这些资源,大大缩短了应用程序的启动时间。
  • 节省内存:多个应用程序进程可以共享 Zygote 进程中预加载的资源,减少了内存的重复占用,提高了系统的内存使用效率。
  • 保证系统稳定性:Zygote 进程作为一个独立的进程,负责管理 Java 虚拟机和系统资源的加载,降低了应用程序进程对系统的影响,提高了系统的稳定性和可靠性。
    在这里插入图片描述

面试相关

为什么app从zygote fork而不是从init fork(预加载后fork的进程可以共享)。
怎么优化zygote加快启动速度(比如加载的类有上万个,可以异步并发加载)。
作者:帅得不敢出门

http://www.xdnf.cn/news/3148.html

相关文章:

  • 三个概念:DataBinding,Dependency Property 与DataTemplate
  • C#静态类与单例模式深度解析(七):从原理到工业级应用实践
  • iview 如何设置sider宽度
  • 论文阅读:2024 arxiv Jailbreaking Black Box Large Language Models in Twenty Queries
  • 17、商品管理:魔药商店运营——React 19 CRUD实现
  • 【Unity C#从零到精通】项目深化:构建核心游戏循环、UI与动态敌人系统
  • ASP.NET MVC后端控制器用模型 接收前端ajax数据为空
  • Copilot总结Word长文档功能更新升级
  • Elasticsearch--自带“搜索引擎“的数据库
  • uniapp 实现低功耗蓝牙连接并读写数据实战指南
  • 2025年“深圳杯”数学建模挑战赛C题-分布式能源接入配电网的风险分析
  • a-upload组件实现文件的上传——.pdf,.ppt,.pptx,.doc,.docx,.xls,.xlsx,.txt
  • Electron Forge【实战】带图片的 AI 聊天
  • 罗技K580蓝牙键盘连接mac pro
  • C# 面向对象实例演示
  • 开源项目实战学习之YOLO11:ultralytics-cfg-models-fastsam(九)
  • Mysql主从复制到分库分表再到读写分离
  • 详解操作系统是如何管理计算机软硬件资源的,以及Linux中进程状态的观察与解释
  • 串口驱动打印下载官网
  • AimRT 从零到一:官方示例精讲 —— 二、HelloWorld示例.md
  • OpenCV-Python (官方)中文教程(部分一)_Day18
  • UVA1537 Picnic Planning
  • transform-实现Encoder 编码器模块
  • NFS-网络文件系统
  • 【codeforces 2086d】背包+组合数学
  • Java之BigDecimal
  • 杭电oj(1015、1016、1072、1075)题解
  • 在线文章系统自动化测试报告
  • MIT6.S081-lab7前置
  • 免费超好用的电脑操控局域网内的手机(多台,无线)