Android系统启动
学习《Android进阶解密》(刘望舒著),总结Android系统启动流程中涉及到的知识点,http://androidxref.com用来阅读源代码。
开机流程
为了了解init进程,首先要了解Android系统启动流程的前几步,以引入init进程。
- 启动电源以及系统启动。从ROM中加载引导程序BootLoader到RAM中然后执行;
- 引导程序BootLoader。将OS拉起来;
- Linux内核启动。在内核完成系统设置后,在系统文件中寻找init.rc文件,并启动init进程;
- init进程启动。
init进程启动总结
init进程是Android系统中用户空间的第一个进程,进程号为1,是Android系统启动流程中的关键的步骤,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建Zygote(孵化器)和属性服务等。init进程是由多个源文件共同组成的,这些文件位于源码目录 system/core/init中。init进程启动做了很多的工作,总的来说做了以下三件事:
- 创建和挂载启动所需的文件目录;
- 初始化和启动属性服务;
- 解析init.rc配置文件并启动Zygote进程。
Zygote进程启动总结
在Android系统中,DVM和ART、应用程序进程以及运行系统的关键服务SystemServer进程都是有Zygote进程来创建的,我们也将它称为孵化器。它通过fork的形式来创建应用程序进程和SystemServer进程,犹豫Zygote进程在启动时会创建DVM或者ART,因此通过fork而创建的应用程序进程和SystemServer进程可以在内部获取一个DVM或者ART的实例副本。Zygote进程启动共做了如下几件事:
- 创建AppRuntime并调用其start方法,启动Zygote进程;
- 创建Java虚拟机并为Java虚拟机注册JNI方法;
- 通过JNI调用ZygoteInit的main函数进入Zygote的Java框架层;
- 通过registerZygoteSocket方法创建服务端Socket,并通过runSelectLoop方法等待AMS的请求来创建新的应用程序进程;
- 启动SystemServer进程。
SystemServer进程启动总结
SystemServer进程主要用于创建系统服务,我们熟知的AMS、WMS和PMS都是由它来创建的。
- 启动Binder线程池。这样就可以与其他进程进行通信;
- 创建SystemServiceManager。其用于对系统的服务进行创建、启动和生命周期管理;
- 启动各种系统服务。BootstrapServices(AMS、PMS等),CoreServices(BatteryService、WebViewUpdateService等),OtherServices(CameraSevice、AudioService、WindowManagerService等)。
Launcher启动总结
系统启动的最后一步时启动一个应用程序用来显示系统中已经安装的应用程序,这个应用程序就叫做Launcher。Launcher在启动过程中会请求PackageManagerService返回系统中已经安装的应用程序的信息,并将这些信息封装成一个快捷图标列表显示在系统屏幕上,这样用户可以通过点击这些快捷图标来启动相应的应用程序。
Android系统启动流程总结
- 启动电源及系统启动。当电源按下时引导芯片代码从预定义的地方(固化在ROM)开始执行。加载引导程序BootLoader到RAM,然后执行;
- 引导程序BootLoader。引导程序BootLoader是在Android操作系统开始运行前的一个小程序,它的主要作用是把OS拉起来并运行;
- Linux内核启动。当内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当内核完成系统设置时,它首先在系统文件中寻找init.rc文件,并启动init进程;
- init进程启动。初始化合启动属性服务,并且启动Zygote进程;
- Zygote进程启动。创建Java虚拟机并为Java虚拟机注册JNI方法,创建服务端Socket,启动SystemServer进程;
- SystemServer进程启动。启动Binder线程池和SystemServiceManager,并且启动各种系统服务;
- Launcher启动。被SystemServer进程启动的AMS会启动Launcher,Launcher启动后会将已安装应用的快捷图标显示到界面上。