Android 系统启动流程源码分析

一、Init进程启动

是一个由内核启动的用户级进程。内核自行启动之后,就通过启动一个用户级程序init的方式,完成引导进程。

启动的代码init.c中的main函数执行过程:system\core\init.c中:
在这里插入图片描述
主要下面两个重要的过程:
1、rc文件解析
在这里插入图片描述

进入解析函数,把解析出来的东西放入相应的类型(List)
在这里插入图片描述

2、执行command和processes
进入死循环:执行execute_one_command和restart_processes
在这里插入图片描述

第二个原函数调用关系如下
在这里插入图片描述

准备启动service:service_start_if_needed
在这里插入图片描述

启动service的主要入口函数:service_start
在这里插入图片描述

创建进程函数:fork
在这里插入图片描述

执行新的service:execve
在这里插入图片描述

下面启动zygote为例子,在init.rc有这样一段描述
在这里插入图片描述

而svc->args[0]的值就是上面反选的代码。
函数execve(执行文件)说明: execve()用来执行参数filename字符串所代表的文件路径,第二个参数系利用数组指针来传递给执行文件,最后一个参数则为传递给执行文件的新环境变量数组。
返回值 如果执行成功则函数不会返回,执行失败则直接返回-1。

上面是sercice启动,下面在再举个action启动流程的例子
在这里触发,加入到action队列:
在这里插入图片描述

在init.c中main函数有这样一段代码:表示执行action队列
在这里插入图片描述

init.rc有这样一段描述
在这里插入图片描述

单执行到early-init的时候,就会启动这个函数.rc的start对应do_start,看下面代码片段:
在这里插入图片描述

进入do_start函数:
在这里插入图片描述

把参数early-init传入service_start函数,启动init进程,由于kernel启动的时候就已经启动了init进程,所以直接进入init进程的main函数了,看下面描述就会明白:
在这里插入图片描述

因为ueventd 和 Init 在同一个可执行文件下,因此在启动ueventd进程时,进程入口函数依然是main,进入main函数:
在这里插入图片描述
然后进入ueventd_main函数,完成!

二、启动serviceManager

在脚本文件Init.rc的描述,其中/system/bin/servicemanager adb shell 在小机端可以看到:
在这里插入图片描述

看看下面就知道对应源码的位置了:
在这里插入图片描述

打开Android.mk内容如下:
在这里插入图片描述
看到了: LOCAL_MODULE := servicemanager,而servicemanager就是上述.rc的servicemanager对应,所以源码就是service_manager.c;最后,使用include $(BUILD_EXECUTABLE)表示以一个可执行程序的方式进行编译。

源码的位置为:frameworks\base\cmds\servicemanager\service_manager.c
在这里插入图片描述
servicemanager用来管理系统中所有的binder service,不管是本地的c++实现的还是java语言实现的都需要这个进程来统一管理,最主要的管理就是,注册添加服务,获取服务。所有的Service使用前都必须先在servicemanager中进行注册。主要函数如下:
do_find_service( )
do_add_service( )
svcmgr_handler( )

三、Zygote进程启动

Zygote这个进程是非常重要的一个进程,Zygote进程的建立是真正的Android运行空间,初始化建立的Service都是Navtive service。

在脚本文件init.rc的描述
在这里插入图片描述源码的位置为:frameworks\base\cmds\app_process\app_main.cpp
参数为:–zygote --start-system-server
在这里插入图片描述

接着就到了AndroidRuntime类了,代码调用了:
在这里插入图片描述

调用代码位置:Frameworks\base\core\jni\AndroidRuntime.cpp
在这里插入图片描述

再往下就调用了静态main函数
在这里插入图片描述

进入的代码位置为:frameworks\base\core\java\com\android\internal\os\ZygoteInit.java
在这里插入图片描述
Zygote就建立好了,利用Socket通讯,接收请求,Fork应用程序进程,进入Zygote进程服务框架中。

上述中的main函数,是在另外一个.so中,名为:libandroid_runtime.so,是一个共享库。在app_process加载的时候,就把这个.so编译进来了,看下面代码:
在这里插入图片描述

再看libandroid_runtime.so是在哪里编译出来的:Frameworks\base\core\jni\Android.mk,代码片段如下:
在这里插入图片描述
通过上面的共享库和资源加载preload(),整个虚拟机的资源都是共享的,当有fork出其他的虚拟机时候,就可以节省资源了,提高了效率!

四、SystemServer启动

在Zygote进程进入循环之前,调用了startSystemServer( )
在这里插入图片描述
在这里插入图片描述

调用代码位置:frameworks\base\core\java\com\android\internal\os\RuntimeInit.java
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从startSystemServer开始执行并没有去调用SystemServer的任何方法,只是通过反射获取了main方法,付给了MethodAndArgsCaller,并抛出了MethodAndArgsCaller异常。
此异常是在哪里处理的呢?回到startSystemServer( )函数的调用处:在ZygoteInit的main函数中:
在这里插入图片描述

如果startSystemServer抛出了异常,跳过执行ZygoteInit进程的循环,这是怎么回事呢?
在startSystemServer中异常是由handleSystemServerProcess抛出。
在这里插入图片描述

MethodAndArgsCaller run函数:调用前面所提到的
//SystemServer main方法
m = cl.getMethod(“main”, new Class[] { String[].class });
在这里插入图片描述

启动了进程SystemServer。
在这里插入图片描述

init1代码位置为:frameworks\base\services\jni\com_android_server_SystemServer.cpp
在这里插入图片描述
在这里插入图片描述

在systme_init()中有调用:init2
在这里插入图片描述

再回到init2
在这里插入图片描述
在这里插入图片描述

在类ServerThread启动了大量的服务,可以仔细看看有哪些服务;关键可以到到这些:
在这里插入图片描述
在这里插入图片描述
一切就绪,只差Home启动界面!

五、Home启动

在systemReady中调用了下面函数:
在这里插入图片描述
看下面代码重点:
//Launcher
在这里插入图片描述
然后就启动了Home界面,完成了整个Android启动流程。

六、附件

整个流程如下:
在这里插入图片描述

ps查看开机启动的进程:(看看pid和ppid的关系)

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

觉得本文对您有用,麻烦点赞、关注、收藏,您的肯定是我创作的无限动力,谢谢!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

泰克示波器如何存储CSV文件?

泰克示波器可以用于各种信号的测量和分析。在实际测试中,我们经常需要将示波器采集到的波形数据保存下来,以便后续的处理和分析。泰克示波器提供了多种方法来存储波形数据,其中一种常用的方式是将数据保存为CSV文件。下面将介绍泰克示波器如何…

VINS预积分与误差模型

文章目录 IMU的测量值误差模型IMU预积分真实模型IMU预积分估计模型误差模型普通增量积分中值积分法 参考文献 IMU的测量值误差模型 IMU的测量值误差模型: a ^ t a t R w t g w b a t n a t ω ^ t ω t b ω t n ω t \begin{array}{} {{{\hat a}_t} {a_t…

成功案例(IF=7.3)| 转录组+蛋白质组+代谢组联合分析分析揭示胰腺癌中TAM2相关的糖酵解和丙酮酸代谢重构

研究背景 肿瘤的进展和发展需要癌细胞的代谢重编程,癌细胞能量代谢模式的改变可以满足快速增殖和适应肿瘤微环境的需要。肿瘤微环境(TME)中的代谢状态受到多种因素的影响,包括血管生成、与其他细胞的相互作用和系统代谢。代谢异质…

Python中批量提取[]括号内第一个元素的四种方法

目录 一、引言 二、方法介绍 使用正则表达式(Regular Expression) 使用字符串分割(String Split) 使用ast模块解析字符串为列表 使用JSON模块解析字符串 三、方法比较与选择 四、总结 一、引言 在Python数据处理过程中&a…

探索1688、淘宝、京东搜索商品聚合API接口:一站式电商搜索解决方案

随着电商行业的不断发展,电商平台的数量和商品种类都在快速增长。商家和开发者在运营过程中,需要经常进行跨平台的商品搜索和数据分析。然而,由于各个电商平台的数据接口存在差异,直接对接多个平台不仅效率低下,而且维…

仓库管理员如何入门?仓库管理六大步骤教会你!

新手菜鸟入行,如何做好一个仓库管理员?仓库运营对于许多行业至关重要,例如制造、零售和物流。它们涉及高效、安全地接收、仓储、拣选、包装和运输货物。 跟着这6个步骤做,最慢一个月,最快一周,就能轻松做好…

42.乐理基础-拍号-看懂拍号的意义

到这必然是已经知道 X、Y的意思了: 然后带入数字: 然后念拍号的时候,在国内,百分之九十的地方是从下往上念,念作四二拍,还有百分之十的地方是和国外一样,从上往下念,念作二四拍&…

GPS与精致农业 无人机应用 农业遥感 农业类

全球定位系统是美国国防部主要为满足军事部门对海上、陆地和空中设施进行高精度导航和定位的要求而建立的。GPS系统最基本的特点是以“多星、高轨、高频、测量-测距”为体制,以高精度的原子钟为核心。GPS作为新一代卫星导航与定位系统,不仅具有全球性、全…

大模型外推能力

一、目录 定义如何提高模型的外推能力?分类测评方法各技术点,以及应用模型,优缺点支持模型长上下文的方案「NTK-aware interpolation」的思路是什么?LLM长度外推方案NTK-by-parts的思路是什么?LLM长度外推方案YaRN是怎…

普通组件的注册-局部注册和全局注册

目录 一、局部注册和全局注册-概述 二、局部注册的使用示例 三、全局注册的使用示例 一、局部注册和全局注册-概述 组件注册有两种方式: 局部注册:只能在注册的组件内使用。使用方法:创建.vue文件,在使用的组件内导入并注册。…

编程语言QT、C++、C#、Matlab、SQL Server开发日志总结

目录 引言 正文 1、Qt连接SQL server数据库 2、C#使用chart绘制实时折线图,波形 3、ORACLEXE数据库 4、QT通过ODBC驱动连接Oracle数据库 5、Microsoft SQL Server 2014 安装图解 6、SQL Server 2014应用 7、C/C​​​​​​​ 8、QT…

vue2后台管理项目

一:项目准备 1)拉取模板代码 远程仓库复制到本地仓库. 2)安装后的项目 路径 code 文件夹 会打开vscode的文件夹. 3)安装vetur和eslint插件可以保存时自动修改不规范的地方. 4)App内有一级路由,路由组件导入如果是layout架子,会导入的是文件夹下的index.js没有则导入index.v…

深度学习实战76-基于目标检测YOLOv5模型的迁移学习使用方法,YOLOv5的原理与结构

大家好,我是微学AI,今天给大家介绍一下深度学习实战76-基于目标检测YOLOv5模型的迁移学习使用方法,YOLOv5的原理与结构。YOLOv5(You Only Look Once version 5)是一种先进的目标检测算法,基于深度学习的单阶段目标检测模型。它的主要原理是通过一次前向传播就同时预测图像…

【Python】字典题

题目:输入一段文本,统计每个字符的个数 in_inputinput(“输入:”) dic{} for char in in_input: if char in dic: dic[char]1 # 字典添加键值对的方法,给字典给键和值的方法 else: dic[char]1 print(dic) for key,value in dic.i…

6、随机森林(Random forests)

Random forests started a revolution in machine learning 20 years ago. For the first time, there was a fast and reliable algorithm which made almost no assumptions about the form of the data, and required almost no preprocessing. In today’s lesson, you’ll…

Apache SeaTunnel 正式发布2.3.5版本,功能增强及多个Bug修复

经过两个月的筹备,我们在2.3.4版本基础上进行了新一轮的迭代,本次更新不仅修复了多个关键问题,还引入了若干重要功能增强和性能优化。 在此,我们先提前感谢社区成员的贡献和支持,如果你想升级最新的版本,快…

26 JavaScript学习:JSON和void

JSON 英文全称 JavaScript Object NotationJSON 是一种轻量级的数据交换格式。JSON是独立的语言JSON 易于理解。 JSON 实例 简单的 JSON 字符串实例: "{\"name\": \"Alice\", \"age\": 25, \"city\": \"San Francisco\&…

【陀螺仪JY61P维特智能】通过单片机修改波特率和角度参考的方法

根据官方文档: 修改波特率 1.解锁:FF AA 69 88 B5 1.1延时200ms 2.修改波特率:FF AA 04 06 00 2.1切换已修改的波特率然后重新发送解锁和保存指令 2.2解锁:FF AA 69 88 B5 2.3延时200ms 4.保存: FF AA 00 00 00 XY轴角度参考 角度参考是以传感器当前的实际位置&…

8款常见的自动化测试开源框架

在如今开源的时代,我们就不要再闭门造车了,热烈的拥抱开源吧!本文针对性能测试、Web UI 测试、API 测试、数据库测试、接口测试、单元测试等方面,为大家整理了github或码云上优秀的自动化测试开源项目,希望能给大家带来…

近似消息传递算法(AMP)单测量模型(SMV)

1、算法解决问题 很多人致力于解决SLM模型的求逆问题,即知道观测值和测量矩阵(字典之类的),要求未知变量的值。SLM又叫做标准线性模型,后续又在此基础上进行升级变为广义线性模型。即SLM是yAxe,这里是线性…