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

Android Framework学习四:init进程实现

文章目录

  • init流程简介
  • init源码执行顺序
    • 执行顺序
  • init进程的具体工作事项
    • 挂载文件系统
    • 设置 SELinux
    • SecondStageMain
    • init.rc启动zygote和serviceManager进程的重要性
      • serviceManager工作原理
  • Framework学习之系列文章

init流程简介

下面图片主要围绕 Android 系统中init进程的运行机制展开介绍
在这里插入图片描述

init源码执行顺序

在这里插入图片描述
init进程是 Android 系统启动时第一个用户空间进程,它从执行main.cpp文件里的main函数开始运行。main函数以循环调用的方式来维持进程的持续运行,确保后续的系统初始化操作能够逐步完成。

执行顺序

  1. FirstStageMain
  2. SetupSelinux
  3. SecondStageMain
    在这里插入图片描述

init进程的具体工作事项

挂载文件系统

将系统所需的各种文件系统挂载到合适的挂载点,这样系统才能访问和使用这些文件系统中的数据和资源。
FirstStageMain:
在这里插入图片描述

设置 SELinux

SELinux(Security-Enhanced Linux)是一种基于 Linux 内核的强制访问控制(MAC)系统,init进程负责对其进行配置和初始化,以增强系统的安全性。
SetupSelinux:
在这里插入图片描述
在这里插入图片描述

SecondStageMain

在这里插入图片描述
在这里插入图片描述
下面的功能都是由SecondStageMain函数实现的。

  1. 启动属性服务:属性服务是 Android 系统中用于存储和管理系统属性的服务,init进程启动该服务后,系统的各个组件就可以通过属性服务来获取和设置系统属性,PropertyInit()。
  2. 解析和执行脚本:除了前面提到的解析init.rc文件,init进程还会执行其他相关的脚本文件,以完成更多的系统初始化和配置工作。

解析init.rc是由LoadBootScripts函数实现:
在这里插入图片描述

  1. 循环处理脚本:通过while循环不断处理脚本中的命令和任务,确保系统的初始化和配置工作能够持续进行。
    在这里插入图片描述
  2. 守护关键进程:init进程会对系统中的关键进程进行监控和守护,当这些进程出现异常退出时,init进程会尝试重新启动它们,以保证系统的稳定性。

init.rc启动zygote和serviceManager进程的重要性

  • zygote进程:如前面所述,它是所有应用进程的父进程。通过zygote进程,系统可以快速创建新的应用进程,提高应用启动的效率。
    在这里插入图片描述

  • serviceManager进程:是 Android 系统里核心的系统服务注册与发现机制 ,处于 Android Framework 层,充当服务注册中心。它为进程间通信(IPC)提供基础架构,允许进程注册、查询和使用系统服务。

init.rc中启动servicemanager的内容:
在这里插入图片描述

serviceManager工作原理

  • 服务注册:应用或系统组件可将 Binder 对象作为服务注册到 ServiceManager。比如系统服务 ActivityManagerService,通过 addService () 方法向 ServiceManager 注册自身服务。
  • 服务发现:客户端凭借 ServiceManager 查询所需服务的 Binder 接口。若服务存在,ServiceManager 返回对应 Binder 引用;若不存在,客户端可选择等待服务注册。
  • IPC 中转:为 Android 的 Binder IPC 提供全局目录,用于绑定客户端和服务端。客户端获取 Binder 引用后,可直接与服务端通信,无需再经 ServiceManager 。

Framework学习之系列文章

Android Framework学习一:系统框架、启动过程
Android Framework学习二:Activity创建及View绘制流程
Android Framework学习三:zygote剖析
Android Framework学习四:init进程实现
作者:帅得不敢出门

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

相关文章:

  • 矩阵分解——Cholesky分解,LU分解,LDLT分解
  • 华为5.7机考第一题充电桩问题Java代码实现
  • Sourcetree安装使用的详细教程
  • 深入解析网络联通性检测:ping 与 tracert 的原理、用法及实战应用
  • 范式之殇-关系代数与参照完整性在 Web 后台的落寞
  • Linux基础篇命令整合表(大全)
  • Cjson格式解析与接入AI大模型
  • Git标签删除脚本解析与实践:轻松管理本地与远程标签
  • Mysql--基础知识点--91.2--processlist
  • 【LangChain高级系列】LangGraph第一课
  • 开目新一代MOM:AI赋能高端制造的破局之道
  • redhat9 安装pywinrm
  • 制造企业如何选择项目管理软件系统提高项目执行的效率和质量
  • 面试题:请解释Java中的反射机制,并说明其使用场景
  • 2025年科学教育与文化交流国际会议(IACSECE 2025)
  • 【软件设计师:数据】17.数据安全
  • LeetCode 3342.到达最后一个房间的最少时间 II:dijkstra算法(和I一样)
  • 基于OpenCV的人脸识别:EigenFaces算法
  • 变桨系统升级新引擎:CAN转ModbusTCP协议转换技术破解风电数字化困局
  • 在 Spring Boot 中实现动态线程池的全面指南
  • Github 2025-05-09 Java开源项目日报 Top10
  • Error parsing column 10 (YingShou=-99.5 - Double) dapper sqlite
  • 坐席业绩可视化分析工具
  • AbMole:QS-21的作用机理及免疫应用
  • J-Scope的RTT模式
  • 智慧工会服务平台建设方案Word(23页)
  • 智慧农业运维平台养殖—传感器管理监控设计—仙盟创梦IDE
  • AI日报 · 2025年5月09日|OpenAI Deep Research 上线 GitHub Connector Beta
  • 爬虫学习————开始
  • 健康养生:雕琢生命的细腻艺术