XJBX-1-Android系统的启动

245 阅读3分钟

启动流程图

image.png

简要说明

1. Bootloader引导
  bootloader是设备按下电源时,最小运行的程序,主要作用就是初始化基本的硬件设备(CPU,内存,Flashd)等,通过内存空间映射,为装载Linux内核准备好运行环境。在Bootloader运行期间,可按下组合键进入Fastboot模式或者Recovery模式。这个功能玩过刷机的同学应该熟悉。
  FastBoot是Android系统通过USB更新系统分区映像的协议,可以更新指定的设备分区。如果是手机厂商的同学会很熟悉此功能。
Recovery是Android的升级系统,进入此模式,设备可以选择OTA升级或恢复出厂,本质是进入了一个文本类型的Linux环境。
  Linux内核,系统的启动的初始,Android系统的创建就是依赖于Linux内核,内核的作用初始化根文件系统,进程管理等核心功能,进一步会启动Init进程,是Android的入口。
2. Init进程
  Limux内核加载完毕后,会首先启动Init 进程,Init进程是系统的第一个进程。在Init 进程的自动过程中,会解析Linux的配置脚木init.c文件。根据int.c文件的内容,Init进程会装载Android的文件系统、创建系统目录、初始化属性系统、启动Android系统重要的守护进程,这些进程包括USB守护进程、adb守护进程、vold 中护进程、rild中守护进程等。Init进程也会作为守护进程来执行修改属性请求,重启崩溃的进程等操作。
3. 启动ServiceManager
  ServiceManager由Init 进程启动。它主要的作用是管理Binder服务,负责Binder服务的注册与查找。
4. 启动Zygote
  Init进程初始化结束时,会启动Zygote进程。Zygote 进程负责fork出应用进程,是所有应用进程的父进程。Zygote进程初始化时会创建Dalivik虚拟机、预装载系统的资源文件和Java类所有从Zygote进程fork出的用户进程将继承和共享这些预加载的资源,不用浪费时间重新加载,加快了应用程序的启动过程。启动结束后,Zygote 进程也将变为守护进程,负责响应启动APK应用程序的请求。
PS:面试装逼问法:孵化应用进程这种事情为什么不交给SystemServer来做,而专门设计一个Zygote?
5. 启动SystemServer
  SystemServer 是Zygote 进程fork出的第一个进程,也是整个Android 系统的核心进程。在SystemServer 中运行着Android系统大部分的Binder服务SystemServer首先启动本地服务SensorSevice;接着启动包括ActivityManagerService,WindowsMangerService,PackageManagerServicc在内的所有Java服务。
6. 启动MediaServer
  MediaServer由Init进程启动。它包含了一些多媒体相关的本地Binder 服务,包括:CameraService AudioFlingerSrvice MediaPlayerService和AudioPolicyService,这个Server单独初始化,而不是像其他AMS,开机视频,开机铃声由它来负责,所以初始化时序比较早。
7. 启动Launcher
  SystemServer 加载完所有Java服务后,最后会调用AtviyMangerSerice的SystemReady()方法。在这个方法的执行中,会发出Intent“android itent caegoy.HOME”凡是响应这个Inten的apk应用都会运行起来,Lancher应用是Android系统默认的桌面应用,一般只有它会响应这个Intent,因此系统开机后,第一个运行的应用就是Launcher.

源码好无聊,有兴趣自己去看吧,说了那么多,面试的时候你知道该怎么吹了吧......