首先需要说明的是,了解Android系统的启动过程,对于更好的理解应用程序进程的启动流程、四大组件原理、AMS、ClassLoader等,都很有帮助。但是由于整个启动过程的细节很多也很复杂,从源码角度来看,涉及到大量的C/C++方面的代码。作为Android应用开发来说,深究细节还是比较吃力的。所以这篇文章,只是介绍大致的流程,和一些在应用层开发方面需要知道的知识点。
Android系统启动流程
先来看下流程图,然后再一步步介绍
1. 启动电源以及系统启动
当电源按下时引导芯片代码从预定义的地方(固化在ROM)开始执行,加载引导程序BootLoader到RAM,然后执行。
2.引导程序BootLoader
引导程序BootLoader是在Android操作系统开始运行前的一个小程序,它的主要作用就是把系统OS拉起来并运行。
3. Linux内核启动
当内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当内核完成系统设置时,它首先在系统文件中寻找init.rc文件,并启动init进程。
4. init进程启动
初始化和启动属性服务,并启动Zygote进程。
init进程启动,主要做了这么几件事
- 创建和挂载启动所需要的文件目录
- 初始化和启动属性服务
- 解析init.rc配置文件并启动Zygote进程
init进程是Android系统中用户空间的第一个进程,进程号为1。
关于僵尸进程与危害
在UNIX/Linux中,父进程使用fork创建子进程,在子进程终止后,如果父进程不知道子进程已经终止了,这时子进程虽然已经退出了,但是在系统进程表中还是为它保留了一些信息(比如进程号、退出状态、运行时间等),这个子进程就被称作是僵尸进程。有点类似Java内存泄漏的意思。系统进程表是一项有限的资源,如果系统进程表被僵尸进程耗尽的话,系统就可能无法创建新的进程了。
关于属性服务
我们都知道,Windows系统中有一个注册表管理器,注册表的内容采用键值对的形式记录用户、软件的一些使用信息。即使系统或者软件重启,还是可以根据之前注册表中的记录,进行相应的初始化工作。Android也提供了一个类似的机制,叫做属性服务。
init进程启动时会启动属性服务,并为其分配内存,用来存储这些属性。如果需要这些属性,直接读取就可以了。
5. Zygote进程启动
创建Java虚拟机(Dalvik)并为Java虚拟机注册JNI方法,创建服务器端Socket,启动SystemServer进程。
在Android系统中,Dalvik虚拟机和ART(Android Runtime)、应用程序进程以及运行系统的关键服务的SystemServer进程都是由Zygote进程创建的。它通过fork(复制进程)的形式来创建应用程序进程和SystemServer进程。由于Zygote进程在启动时会创建Dalvik虚拟机或者ART,因此通过它fork自身而创建的应用程序进程和SystemServer进程可以在进程内部获取一个Dalvik虚拟机或者ART的实例副本。这也就是我们通常理解的,一般情况下,一个应用程序对应着一个进程和一个Dalvik虚拟机实例。
关于ZygoteInit的main方法
在我们通过JNI调用ZygoteInit的main方法后,Zygote便进入了Java框架层,此前的启动过程中,没有任何代码进入Java框架层。换句话说是Zygote开创了Java框架层。
ZygoteInit.main()方法主要做了四件事:
1 创建Server端的socket
2 预加载类和资源
3 启动SystemServer进程
4 等待AMS请求创建新的应用程序进程
Zygote进程的启动过程中,主要做了这么几件事
- 创建AppRuntime并调用其start方法,启动Zygote进程
- 创建Java虚拟机并为Java虚拟机注册JNI方法
- 通过JNI调用Zygote的main方法进入Zygote的Java框架层
- 通过registerZygoteSocket方法创建服务器端的socket,并通过runSelectLoop方法等待AMS请求来创建新的应用程序进程。
- 启动SystemServer进程
6.SystemServer进程启动
启动Binder线程池和SystemServiceManager,并且启动各种系统服务,如AMS、WMS、PMS等。
7. Launcher启动
有SystemServer进程启动的AMS会启动Launcher,Launcher启动后会将已安装应用程序的快捷图标显示在桌面。
系统启动的最后一步是启动一个应用程序用来显示系统中已经安装的应用程序。这个应用程序就是Launcher。Launcher在启动过程中会请求PackageManagerService返回系统中已经安装的应用程序的信息,并将这些信息封装成一个快捷图标列表显示在屏幕上。用于点击这些快捷图标以启动相应的应用程序。
通俗来讲,Launcher就是Android系统的桌面,它的作用主要有两点:
1 作为Android系统的启动器,用于启动应用程序
2 作为Android系统的桌面,用于管理和显示应用程序的快捷图标或者其他桌面组件。
本文参考:
《Android进阶解密》