前言html
转载请声明,转自【http://www.javashuo.com/article/p-zvxsijfz-cb.html】谢谢!java
对于一个Android应用层开发者来讲,了解Android系统的启动流程对理解Android系统有很大的帮助。这其中包含了大量的细节,并且前面不少步骤包含了C/C++实现的native层逻辑,做为一个应用层的开发者来讲,很难也不必掌握得太深刻。本文简单整理了Android系统的启动流程,对具体细节感兴趣的朋友能够自行深刻研究。android
Android系统启动流程小程序
Android系统的启动流程,从按power按键启动电源开始,到Launcher应用程序启动完成结束,这里大体能够分为以下7个步骤。框架
一、开启电源执行BootLoader引导程序oop
当按下电源后,会引导芯片代码从预约义的地方开始执行(该预约义的地方固化在ROM中),将引导程序BootLoader加载到RAM中执行。ROM和RAM是内存的中的两个部分,前者是Read-Only-Memmory的缩写,顾名思义,就是只读的内存,这其中会预先存储一些信息,好比这里系统启动时须要的信息。后者是Read-Acess-Memmory的缩写,写入的内存,在程序运行过程当中能够动态写入数据,系统关闭后,数据会被清除。学习
二、BootLoader拉起并执行操做系统spa
BootLoader执行时,会拉起并运行操做系统。BootLoader是一个引导程序,是在Android操做系统开始运行前的一个小程序,它的做用就是拉起并运行操做系统。操作系统
三、操做系统启动init进程线程
Android操做系统基于Linux内核实现,因此此时Linux内核开始启动,进行系统设置。当完成系统设置后,会首先在系统文件中寻找init.rc脚本文件,并启动init进程。
四、init进程启动
init,经过名称能够判断它的做用是作一些初始化的工做。init进程是Android系统中用户空间的第一个进程,进程号为1,是Android系统启动中的一个关键进程,做为第一个进程,它被赋予了不少重要的职责,简单归纳为:
(1)建立和挂载启动系统所须要的文件目录。
(2)初始化和启动属性服务。这里的属性服务,相似于Windows操做系统中的注册表管理器,用来记录用户、软件等的一些信息。
(3)解析init.rc配置文件,并启动Zygote进程。
五、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进程。
六、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 //初始化系统context 13 createSystemContext(); 14 //建立SystemServiceManager 15 mSystemServiceManager = new SystemServiceManager(mSystemContext); 16 ...... 17 //启动引导服务,如AMS等 18 startBootstrapServices(); 19 //启动核心服务 20 startCoreServices(); 21 //启动其它服务,如WMS,SystemUI等 22 startOtherServices(); 23 .... 24 }
每一种服务类型包含哪些具体的服务,能够经过上述源码中第1八、20、22行进入到对应的方法中查看。
七、启动Launcher
系统启动的最后一步是启动一个应用程序来显示系统中已经安装的应用程序,这个应用程序就是Launcher。这一步由SystemServer建立的AMS来启动,前面第5点“Zygote进程启动”中讲过,建立一个Socket,来等待AMS请求Zygote建立新的应用程序。Launcher在启动过程当中会请求PowerManagerService返回系统中已经安装的应用程序的信息,并将这些信息封装成一个快捷图标列表显示在系统屏幕上,这样用户能够经过点击这些图标来启动对应的应用程序。总结来讲,就是两点:
(1)做为Android系统的启动器,用于启动应用程序。
(2)做为Android系统的桌面,用于显示和管理应用程序的快捷图标或者其它桌面组件。
Android系统启动流程图
根据上述流程,能够获得以下流程图:
结语
本文整理的内容来源于刘望舒的《Android进阶解密》第二章,该流程基于Android8.0,有兴趣更深刻了解的能够经过本书来进行学习。本文中若是有描述不当或不正确的地方,请不吝赐教,万分感激。