前言

转载请声明,转自【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系统启动流程整理的更多相关文章

  1. Android系统启动流程(一)解析init进程启动过程

    整体流程大致如下:     1.init简介 init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等.in ...

  2. Android系统启动流程(四)Launcher启动过程与系统启动流程

    此前的文章我们学习了init进程.Zygote进程和SyetemServer进程的启动过程,这一篇文章我们就来学习Android系统启动流程的最后一步:Launcher的启动流程,并结合本系列的前三篇 ...

  3. 【Android 系统开发】 Android 系统启动流程简介

    作者 : 万境绝尘 (octopus_truth@163.com) 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/3889548 ...

  4. 源码级分析Android系统启动流程

    首先看一下Android系统的体系结构,相信大家都不陌生 1.首先Bootloader引导程序启动完Linux内核后,会加载各种驱动和数据结构,当有了驱动以后,开始启动Android系统,同时会加载用 ...

  5. Android系统启动流程

    当系统引导程序启动Linux内核,内核会记载各种数据结构,和驱动程序,加载完毕之后,Android系统开始启动并加载第一个用户级别的进程:init(system/core/init/Init.c) 查 ...

  6. Android系统启动流程(二)解析Zygote进程启动过程

    1.Zygote简介 在Android系统中,DVM(Dalvik虚拟机).应用程序进程以及运行系统的关键服务的SystemServer进程都是由Zygote进程来创建的,我们也将它称为孵化器.它通过 ...

  7. Android系统启动流程 总结

    整体流程大致如下:   Android系统的启动,主要是指Android手机关机后,长按电源键后,Android手机开机的过程.从系统角度看,Android的启动程序可分为:   1.bootload ...

  8. 你真的了解Android系统启动流程吗?Android高级工程师必看系列,已开源

    前言 从毕业到现在面试也就那么几家公司,单前几次都比较顺利,在面到第三家时都给到了我offer!前面两次找工作,没考虑到以后需要什么,自己的对未来的规划是什么,只要有份工作,工资符合自己的要求就行!所 ...

  9. 2. Android系统启动流程

    1.启动加载完内核 2.执行init进程   ----> 设备初始化工作       a1. 读取inic.rc       a2. 启动Zygote进程 ----> 该进程是所有进程的孵 ...

随机推荐

  1. Masstransit的应用服务总线

    Masstransit 是一个非常优秀的基于消息进行通信的分布式应用程序框架,详情参考官网. 在介绍AA.ServiceBus之前,先介绍下几个概念. 分布式 分布式系统如何定义?这里引用一下Dist ...

  2. jenkins默认在build结束后会kill掉所有的衍生进程

    在使用jenkins进行自动化部署服务的过程中,发现调用服务器的shell命令无法正常启动tomcat,但是构建日志显示是成功执行的,而手动在服务器却是可以正常启动tomcat. 原因:jenkins ...

  3. springboot集成shiro集成mybatis-plus、redis、quartz定时任务

    完整项目代码位于码云上,点击获取:Git地址 主要介绍一下重点配置地方: 一.application.yml文件 server: port: 8084 servlet: context-path: / ...

  4. python使用kazoo操作zookeeper时候出现的"kazoo.exceptions.ConnectionLoss"错误

    在往zk中写入数据的时候,突然遇到 “kazoo.exceptions.ConnectionLoss“错误,然而对zk链接进行检查,在set之前状态是”CONNECT“. 经过测试后发现是因为写入的字 ...

  5. UPC Contest RankList – 2019年第二阶段我要变强个人训练赛第十五场

    传送门 A: Colorful Subsequence •题意 给一个长为n的小写字母序列,从中选出字母组成子序列 问最多能组成多少种每个字母都不相同的子序列 (不同位置的相同字母也算是不同的一种) ...

  6. spring读取xml配置文件(二)

    一.当spring解析完配置文件名的占位符后,就开始refresh容器 @Override public void refresh() throws BeansException, IllegalSt ...

  7. jdk1.8HashMap底层数据结构:散列表+链表+红黑树,jdk1.8HashMap数据结构图解+源码说明

    一.前言 本文由jdk1.8源码整理而得,附自制jdk1.8底层数据结构图,并截取部分源码加以说明结构关系. 二.jdk1.8 HashMap底层数据结构图 三.源码 1.散列表(Hash table ...

  8. 【Spring】org.springframework.web.context.ContextLoaderListen 报错

    详细信息如下: org.apache.catalina.core.StandardContext.listenerStart Error configuring application listene ...

  9. SonarQube+Jenkins安装工程中遇到的吭

    1. SonarQube是不是有点飘了,居然要java11+才能运行 解决方案: 重新下载老版本 也不知道哪个版本才好用,就下载了7.0 和6.6,这两个版本用jdk1.8就可以用 2. 配置数据库u ...

  10. 如何保证FPGA PCIe唤醒能满足PC的100ms 的时间要求(Autonomous Mode)?

    原创By DeeZeng [ Intel FPGA笔记 ]  PC 需要PCIe设备在 100ms 内启动,这样PC 才能扫描到PCIe 设备.对于 FPGA PCIe 板卡,同样也需要满足这个时间要 ...