文章插图
前言对于一个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)创建和挂载启动系统所需要的文件目录 。
【关于Android系统启动,你需要知道这些步骤】(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,用于等待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也是在这里启动的 。
1 //=========SystemServer.java========= 2 public static void main(String[] args) { 3 new SystemServer().run(); 4 } 5 private void run() { 6 ...... 7 //创建消息Looper 8 Looper.prepareMainLooper(); 9 // 加载动态库libandroid_servers.so,初始化native服务10 System.loadLibrary("android_servers");11 ......12 //初始化系统context13 createSystemContext();14 //创建SystemServiceManager15 mSystemServiceManager = new SystemServiceManager(mSystemContext);16 ......17 //启动引导服务,如AMS等18 startBootstrapServices();19 //启动核心服务20 startCoreServices();21 //启动其它服务,如WMS,SystemUI等22 startOtherServices();23 ....24 }每一种服务类型包含哪些具体的服务,可以通过上述源码中第18、20、22行进入到对应的方法中查看 。
推荐阅读
- 用PS给证件照进行美化
- 关于消息队列的优缺点,看这篇就行
- 电脑系统u盘制作教程 晨枫u盘系统
- 关于滇红茶,你一定要知道这些!
- iPhone系统省电设置
- 鸿蒙系统怎么显示运营商 鸿蒙系统显示运营商名称教程分享
- 最迷惑人的8大性爱谬论
- Windows 10系统的15个隐藏功能
- Java 分布式系统如何实现session共享?
- 微软关于微服务体系结构的理解