【乘风破浪】Android系统启动流程整理
前言
转载请声明,转自【https://www.cnblogs.com/andy-songwei/p/11429421.html】谢谢!
对于一个Android应用层开发者来说,了解Android系统的启动流程对理解Android系统有很大的帮助。这其中包含了大量的细节,而且前面很多步骤包含了C/C++实现的native层逻辑,作为一个应用层的开发者来说,很难也没必要掌握得太深入。本文简单整理了Android系统的启动流程,对具体细节感兴趣的朋友可以自行深入研究。
Android系统启动流程
Android系统的启动流程,从按power按键启动电源开始,到Launcher应用程序启动完成结束,这里大致可以分为如下7个步骤。
1、开启电源执行BootLoader引导程序
当按下电源后,会引导芯片代码从预定义的地方开始执行(该预定义的地方固化在ROM中),将引导程序BootLoader加载到RAM中执行。ROM和RAM是内存的中的两个部分,前者是Read-Only-Memmory的缩写,顾名思义,就是只读的内存,这其中会预先存储一些信息,比如这里系统启动时需要的信息。后者是Read-Acess-Memmory的缩写,写入的内存,在程序运行过程中可以动态写入数据,系统关闭后,数据会被清除。
2、BootLoader拉起并执行操作系统
BootLoader执行时,会拉起并运行操作系统。BootLoader是一个引导程序,是在Android操作系统开始运行前的一个小程序,它的作用就是拉起并运行操作系统。
3、操作系统启动init进程
Android操作系统基于Linux内核实现,所以此时Linux内核开始启动,进行系统设置。当完成系统设置后,会首先在系统文件中寻找init.rc脚本文件,并启动init进程。
4、init进程启动
init,通过名称可以判断它的作用是做一些初始化的工作。init进程是Android系统中用户空间的第一个进程,进程号为1,是Android系统启动中的一个关键进程,作为第一个进程,它被赋予了很多重要的职责,简单概括为:
(1)创建和挂载启动系统所需要的文件目录。
(2)初始化和启动属性服务。这里的属性服务,类似于Windows操作系统中的注册表管理器,用来记录用户、软件等的一些信息。
(3)解析init.rc配置文件,并启动Zygote进程。
5、Zygote进程启动
Zygote的中文翻译为“受精卵”,是生命的开始,从字面意思,我们大致可以领会到它在Android系统中的地位。Dalvik/ART,应用程序进程以及运行系统的关键服务SystemServer都是由Zygote进程创建的,所以一般也称它为孵化器。Zygote需要做很多工作,归纳起来大致有如下几条:
(1)创建Dalvik/ART
(2)从Native层进入到Java框架层。也就是说Zygote开创了Java框架层,这一步是通过Native层通过JNI方式调用ZygoteInit类的main方法来实现。Zygote的路径为:frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
(3)ZygoteInit的main方法中会创建一个Service端的Socket,名称为“zygote”,用于等待AMS请求Zygote创建新的应用程序进程。
(4)ZygoteInit的main方法中还会通过fork方式创建并启动SystemServer进程。
6、SytemServer进程启动
SytemServer是运行系统的关键服务,主要用于创建系统服务,比如AMS,WMS,PMS等。它的主要职责为:
(1)启动Binder线程池。该过程主要通过ZygoteInit.nativeZygoteInit()来调用Native层的方法来实现启动Binder线程池的,这样SystemServer就可以使用Binder与其他进程进行通信。
(2)创建SystemServerManager(SSM),并启动各种服务。这个过程是在SystemServer的main方法中调用实现的,可以参考如下的源码。SystemServerManager用于对系统的服务进行创建、启动和生命周期管理。这里启动的各种服务包括引导服务、核心服务、其他服务三类:引导服务包括AMS、PowerMS、PackageMS等;核心服务包括BatteryService等;其他服务包括WMS等,SystemUI也是在这里启动的。
//=========SystemServer.java=========
public static void main(String[] args) {
new SystemServer().run();
}
private void run() {
......
//创建消息Looper
Looper.prepareMainLooper();
// 加载动态库libandroid_servers.so,初始化native服务
System.loadLibrary("android_servers");
......
//初始化系统context
createSystemContext();
//创建SystemServiceManager
mSystemServiceManager = new SystemServiceManager(mSystemContext);
......
//启动引导服务,如AMS等
startBootstrapServices();
//启动核心服务
startCoreServices();
//启动其它服务,如WMS,SystemUI等
startOtherServices();
....
}
每一种服务类型包含哪些具体的服务,可以通过上述源码中第18、20、22行进入到对应的方法中查看。
7、启动Launcher
系统启动的最后一步是启动一个应用程序来显示系统中已经安装的应用程序,这个应用程序就是Launcher。这一步由SystemServer创建的AMS来启动,前面第5点“Zygote进程启动”中讲过,创建一个Socket,来等待AMS请求Zygote创建新的应用程序。Launcher在启动过程中会请求PackageManagerService返回系统中已经安装的应用程序的信息,并将这些信息封装成一个快捷图标列表显示在系统屏幕上,这样用户可以通过点击这些图标来启动对应的应用程序。总结来说,就是两点:
(1)作为Android系统的启动器,用于启动应用程序。
(2)作为Android系统的桌面,用于显示和管理应用程序的快捷图标或者其它桌面组件。
Android系统启动流程图
根据上述流程,可以得到如下流程图:

结语
本文整理的内容来源于刘望舒的《Android进阶解密》第二章,该流程基于Android8.0,有兴趣更深入了解的可以通过本书来进行学习。本文中如果有描述不当或不正确的地方,请不吝赐教,万分感激。
【乘风破浪】Android系统启动流程整理的更多相关文章
- Android系统启动流程(一)解析init进程启动过程
整体流程大致如下: 1.init简介 init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等.in ...
- Android系统启动流程(四)Launcher启动过程与系统启动流程
此前的文章我们学习了init进程.Zygote进程和SyetemServer进程的启动过程,这一篇文章我们就来学习Android系统启动流程的最后一步:Launcher的启动流程,并结合本系列的前三篇 ...
- 【Android 系统开发】 Android 系统启动流程简介
作者 : 万境绝尘 (octopus_truth@163.com) 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/3889548 ...
- 源码级分析Android系统启动流程
首先看一下Android系统的体系结构,相信大家都不陌生 1.首先Bootloader引导程序启动完Linux内核后,会加载各种驱动和数据结构,当有了驱动以后,开始启动Android系统,同时会加载用 ...
- Android系统启动流程
当系统引导程序启动Linux内核,内核会记载各种数据结构,和驱动程序,加载完毕之后,Android系统开始启动并加载第一个用户级别的进程:init(system/core/init/Init.c) 查 ...
- Android系统启动流程(二)解析Zygote进程启动过程
1.Zygote简介 在Android系统中,DVM(Dalvik虚拟机).应用程序进程以及运行系统的关键服务的SystemServer进程都是由Zygote进程来创建的,我们也将它称为孵化器.它通过 ...
- Android系统启动流程 总结
整体流程大致如下: Android系统的启动,主要是指Android手机关机后,长按电源键后,Android手机开机的过程.从系统角度看,Android的启动程序可分为: 1.bootload ...
- 你真的了解Android系统启动流程吗?Android高级工程师必看系列,已开源
前言 从毕业到现在面试也就那么几家公司,单前几次都比较顺利,在面到第三家时都给到了我offer!前面两次找工作,没考虑到以后需要什么,自己的对未来的规划是什么,只要有份工作,工资符合自己的要求就行!所 ...
- 2. Android系统启动流程
1.启动加载完内核 2.执行init进程 ----> 设备初始化工作 a1. 读取inic.rc a2. 启动Zygote进程 ----> 该进程是所有进程的孵 ...
随机推荐
- C语言入门4-运算符和表达式
一. 分类 C语言一共有34种运算符,10种运算类型,本节我们要掌握的有( 7 种) 算术运算符(+.-.*./.%). 关系运算符(>.>=.==.!=.<.<=). ...
- MySQL 5.7和8.0性能测试
目录 背景 前提 环境 测试 双1模式下 0 2 模式下 结论 背景 测试mysql5.7和mysql8.0 分别在读写.只读.只写模式下不同并发时的性能(tps,qps) 前提 测试使用版本为mys ...
- [译]为任意网格计算tangent空间的基向量
+BIT祝威+悄悄在此留下版了个权的信息说: [译]为任意网格计算tangent空间的基向量 Computing Tangent Space Basis Vectors for an Arbitrar ...
- IOCP Input/Output Completion Port IO完成端口
I/O completion ports provide an efficient threading model for processing multiple asynchronous I/O r ...
- 【MySQL】(一)MySQL 体系结构和存储引擎
1.1.定义数据库和实例 数据库:物理操作系统文件或其他形式文件类型的集合.在MySQL数据库中,数据库文件可以是frm.MYD.MYI.ibd结尾的文件. 实例:MySQL数据库由后台线程以及一个共 ...
- php 常用函数总汇
php 使用命令行函数exec($sql,$result,$status); $sql 命令 $result 返回东西 $status成功与否的状态 例如: php使用命令行去执行数据库备份( ...
- python基础——列表(list)
序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. Python有6个序列的内置类型,但最常见的是列表和元组. 序列 ...
- jsp数据交互(一).3
引入的文件如果是jsp则应定义为***.jspf文件,如果其他文件可定义为***.inc文件,即include file. jsp:include是既可以静态包含又可以动态包含,用jsp:includ ...
- 谈谈用Boox Max 2 阅读A4纸文献的体验
首先说说选择Boox的几个原因: 护眼.这个不用多说,之所以除了电脑,还要电子阅读器,主要是为了护眼. 减少纸质书籍购买.纸质书籍拿在手上是有质感,读起来也更舒服,可一则一些外文书买纸质的是很贵的,相 ...
- 【iOS】libc++abi.dylib: terminate_handler unexpectedly threw an exception
用 ShareSDK 做第三方分享的时候遇到了这个问题…… 联系了客服,后来在他的指导下,发现是数组的问题,该问题不知道是否具有通用性,暂且记下.