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.mzph.cn/pingmian/80401.shtml

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

相关文章

HTTP/3展望、我应该迁移到HTTP/2吗

1. HTTP/3展望 HTTP/3 基于 QUIC 协议,完全解决了“队头阻塞”问题,弱网环境下的表现会优于 HTTP/2;QUIC 是一个新的传输层协议,建立在 UDP 之上,实现了可靠传输;QUIC 内含了 TLS1.3,只能加密通…

【大模型面试每日一题】Day 15:流水线并行的Bubble问题及其缓解方法

【大模型面试每日一题】Day 15:流水线并行的Bubble问题及其缓解方法 📌 题目重现 🌟🌟 面试官:解释流水线并行(Pipeline Parallelism)的bubble问题及其缓解方法。 #mermaid-svg-Uz7WGsO8akW5F…

Windows环境下maven的安装与配置

1.检查JAVA_HOME环境变量 Maven是使用java开发的,所以必须知道当前系统环境中的JDK的安装目录。 搜索栏直接输入“cmd” 或者 WinR 输入cmd 在打开的终端窗口输入“echo %JAVA_HOME”,就可以看到jdk的位置了。 如果没有的话,请参考我的文章&a…

Kubernetes 集群部署应用

部署 Nginx 应用 命令行的方式 1. 创建 deployment 控制器的 pod # --imagenginx:这个会从 docker.io 中拉取,这个网站拉不下来 # kubectl create deployment mynginx --imagenginx# 使用国内镜像源拉取 kubectl create deployment mynginx --imaged…

如何使用依赖注入来实现依赖倒置原则?

依赖注入(Dependency Injection, DI)是实现依赖倒置原则(DIP)的具体技术手段,它通过将依赖对象的创建和管理交给外部容器,从而实现高层模块与低层模块的解耦。下面从原理、实现方式、框架应用及最佳实践四个方面详细解析: 一、依赖倒置原则(DIP)的核心思想 高层模块不…

python使用AES进行加密和解密

如果需要加密和解密功能,可以使用AES算法。以下是使用Python实现AES加密和解密的示例: from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad from Crypto.Random import get_random_bytesdef aes_encrypt(data,

SaaS场快订首页的前端搭建【持续更新】

文章目录 一、创建页面二、配置路由三、写接口文件(api)1.定位的接口函数(腾讯地图api)实现代码: 2.获取场馆分类的数据3.获取附近场馆列表的数据 四、开发首页页面1.顶部区域2.搜索框3.场馆分类4.附近场馆列表 五、难…

深入解析 MQTT 协议:物联网通信的基石

在当今物联网蓬勃发展的时代,设备之间高效、可靠的通信变得至关重要。MQTT(Message Queuing Telemetry Transport)协议,作为一种轻量级的消息传输协议,正逐渐成为物联网通信的基石,广泛应用于各种场景中。 …

在Python中计算函数耗时并超时自动退出

更多内容请见: python3案例和总结-专栏介绍和目录 文章目录 方法1:使用装饰器结合信号模块(仅Unix-like系统)方法2:使用多线程(跨平台解决方案)方法3:使用concurrent.futures(Python 3.2+)方法4:使用 multiprocessing + Process(跨平台)​方法5:使用 time 手动计…

理解c++中explicit关键字的作用

理解c中explicit关键字的作用 explicit 关键字的作用是防止构造函数被隐式调用&#xff0c;从而避免意外的类型转换 #include <iostream> class Vec3 { public://构造函数没有被explicit修饰Vec3(float value): x(value), y(value), z(value){}Vec3(float val1, float …

不止是UI库:React如何重塑前端开发范式?

React&#xff1a;引领现代前端开发的声明式UI库 在当今快速发展的前端世界&#xff0c;React以其声明式、组件化和高效的特性&#xff0c;稳坐头把交椅&#xff0c;成为构建交互式用户界面的首选JavaScript库。本文将带你快速了解React的核心魅力、主要优势以及生态发展&…

理解 Token 索引 vs 字符位置

以下是对“理解 Token 索引与字符位置的区别”的内容整理&#xff0c;条理清晰&#xff0c;结构完整&#xff0c;保持技术细节&#xff0c;方便阅读&#xff0c;无多余解释&#xff1a; &#x1f50d; 理解 Token 索引 vs 字符位置 文本分块方法中返回的索引是 token 索引&…

《异常链机制详解:如何优雅地传递Java中的错误信息?》

大家好呀&#xff01;&#x1f44b; 作为一名Java开发者&#xff0c;相信你一定见过各种奇奇怪怪的异常报错。但有没有遇到过这样的情况&#xff1a;明明只调用了一个方法&#xff0c;却看到异常信息像俄罗斯套娃一样一层层展开&#xff1f;&#x1f914; 这就是我们今天要讲的…

vector 常见用法及模拟

文章目录 1. vector的介绍与使用1.1 vector的构造1.2 vector iterator 的使用1.3 有关大小和容量的操作1.4 vector 增删查改1.5 vector 迭代器失效问题&#xff08;重点&#xff09;1.6 vector 中二维数组的使用 2. vector 的模拟实现2.1 拷贝构造和赋值重载的现代写法2.2 memc…

数据结构与算法分析实验11 实现顺序查找表

实现顺序查找表 1.上机名称2.上机要求3.上机环境4.程序清单(写明运行结果及结果分析)4.1 程序清单4.1.1 头文件4.1.2 实现文件4.1.3 源文件 4.2 实现展效果示 上机体会 1.上机名称 实现顺序查找表 顺序查找表的基本概念 顺序查找表是一种线性数据结构&#xff0c;通常用于存储…

实践官方的 A2A SDK Python

内容列表 • 注意• 我的环境• A2A SDK Python 注意 这只是一个原型&#xff0c;并且在快速的变化&#xff0c;本篇教程也随时可能过期&#xff0c;可以在A2AProtocol blog最终更新的文章。 我的环境 • Python 3.13• uv: uv 0.7.2 (Homebrew 2025-04-30)• Warp• Olla…

langchain 接入国内搜索api——百度AI搜索

为什么使用百度AI搜索 学习langchain的过程中&#xff0c;遇到使用search api的时候&#xff0c;发现langchain官方文档中支持的搜索工具大多是国外的&#xff0c;例如google search或bing search&#xff0c;收费不说&#xff0c;很多还连接不上&#xff08;工具 | LangChain…

[强化学习的数学原理—赵世钰老师]学习笔记01-基本概念

[强化学习的数学原理—赵世钰老师]学习笔记01-基本概念 1.1 网格世界的例子1.2 状态和动作1.3 状态转移1.4 策略1.5 奖励1.6 轨迹、回报、回合1.6.1 轨迹和回报1.6.2 回合 1.7 马尔可夫决策过程 本人为强化学习小白&#xff0c;为了在后续科研的过程中能够较好的结合强化学习来…

Java开发经验——阿里巴巴编码规范经验总结2

摘要 这篇文章是关于Java开发中阿里巴巴编码规范的经验总结。它强调了避免使用Apache BeanUtils进行属性复制&#xff0c;因为它效率低下且类型转换不安全。推荐使用Spring BeanUtils、Hutool BeanUtil、MapStruct或手动赋值等替代方案。文章还指出不应在视图模板中加入复杂逻…

Java大师成长计划之第18天:Java Memory Model与Volatile关键字

&#x1f4e2; 友情提示&#xff1a; 本文由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;平台gpt-4o-mini模型辅助创作完成&#xff0c;旨在提供灵感参考与技术分享&#xff0c;文中关键数据、代码与结论建议通过官方渠道验证。 在Java多线程编程中&#xff0c;线程…