![1870221-27311a9dce3f54a4.png](https://i-blog.csdnimg.cn/blog_migrate/5287412bd53d3dffd4e785a5e90afdf5.webp?x-image-process=image/format,png)
说起Android的系统启动,真的是很恐怖的一件事,因为里面具体设计的东西很多,但是我们如果不是搞系统开发的是不需要学习那么细致的,我们要做的是了解这个过程,以及过程里的作用。每年Android源码多多少少都有一些变化,如果我们只是记住了细节而不在乎这个整体思想,那么无异于自寻死路,苦恼不已。
首先我们大概的了解一下 Android 系统启动的大致过程:
1、启动电源以及系统启动
这个没啥可说的,开机电源启动永远是第一步。然后引导芯片会从 ROM 中开始执行。加载引用芯片BootLoader 到 RAM 。注意ROM和RAM的作用区分。
2、引导程序BootLoader
在Android操作启动前,需要引导程序BootLoader先运行,它的主要作用就是把系统OS拉起来并运行。
3、Linux内核启动
当内核启动的时候,设置缓存,被保护存储器,计划列表,加载驱动。在内核完成着一系列问题后,它首先在系统文件中寻找init.rc文件,并启动init进程。
4、init进程启动
init进程工作就很多了,主要是初始化和启动属性服务,也用来启动Zygote进程。
用通俗的话就是说:先开机通电,然后把ROM里的引导程序BootLoader加载到RAM中并运行,把OS给拉起来,就像氢弹必须原子弹引爆一个意思,谱很大。然后这个OS系统说白了,基于Linux,其实就是Linux内核,所以Linux内核就该启动了,干一些乱七八糟,我们不用管的事情,最后重点来了,它启动的差不多,该启动init.rc进程了。init是我们学习的重点,最后启动Zygote,然后Zygote也是重点。
init
代码很多很复杂,提出代表性,和我们相关的步骤。
// 1、对属性服务进行初始化
property_init();
//2、用于设置子进程信号处理函数,如果子进程(zygote进程)异常退出,
//init进程会调用该函数中设定的信号量处理函数来进行处理
signal_handle_init();
//3、启动服务
start_property_service();
//4、解析 init.rc 配置文件
parser.ParseConfig("/init.rc");
//5、重启死去的进程
restart_processes();
对于2的作用,主要用于防止子进程变成僵尸进程。系统会在子进程暂停和终止的时候发出 SIGCHLD 信号,而 signal_handle_init 函数就是来接收SIGCHLD信号的。(其内部只处理进程终止的SIGCHLD信号)
什么是僵尸进程呢?
在UNIX/Linux中父进程使用fork创建子进程,当子进程终止之后,如果父进程并不知道子进程已经终止了,这是子进程虽然已经退出了,但是在系统表中还为它保留了一些信息(比如进程号,退出状态,运行时间等等),这个子进程就成为僵尸进程。因为系统的资源是有限的,如果系统进程被僵尸进程耗尽的话,那么系统就无法在创建新的进程了。
那么init进程启动干了三件事:
1、创建和挂载启动所需要的文件目录。
2、初始化和启动属性服务。
3、解析init.rc配置文件并启动Zygote进程。
接下来就是Zygote的启动
首先什么是Zygote呢?
在Android系统中,DVM)(dalvik虚拟机)和 ART ,应用程序以及运行系统的关键服务的SystemServer进程都是有Zygote进程创建的。我们也将它成为孵化器。它通过fork(复制进程)的方式来创建应用程序进程和SystemServer进程,由于Zygote进程在启东时会创建DVM或者ART,因此通过fork而创建的应用程序进程和 SystemServer 进程可以在内部获得DVM或者ART的实例副本。
小插曲:
Zygote进程是在init进程中启动时创建的,起初Zygote进程的名字并不是叫 zygote 而是叫 app_process 这个名字是在Android.mk 中定义的,Zygote进程启动后,Linux系统下的pctrl系统会调用app_process ,将其名称换成 zygote。
Zygote进程一共干了五件事:
1、创建 AppRuntime 并调用其start方法,启动Zygote进程。
2、创建 Java 虚拟机并为Java虚拟机注册JNI方法。
3、通过 JNI 调用 ZygoteInit 的 main 函数进入 Zygote 的Java 框架层。
4、通过 registerZygoteSocket方法创建服务器端 Socket,并通过 runSelectLoop 方法等待 AMS 的请求来创建新的应用程序进程。
5、启动SystemServer进程。
SystemServer进程一共干了三件事:
1、启动 Binder 线程池,这样就可以与其他进程进行通信。
2、创建 SystemServerManager ,用于对系统的服务进行创建,启动和生命周期管理。
3、启动各种系统服务。
Launcher启动:
系统启动的最后一步是启动一个应用程序用来显示系统中已经安装的应用程序,这个应用程序就叫做Launcher。Launcher 在启动的过程中会请求PackgetManagerServer 返回系统中已经安装的应用程序的信息,并将这些信息封装成一个快捷方式列表显示在系统屏幕上,这样用户就可以通过点击这些快捷图标来启动相对应的应用程序了。
Launcher 就是Android的桌面,主要有以下两点:
1、作为Android 系统的启动器,用于启动应用程序。
2、作为Android系统桌面,用于显示和管理应用程序的快捷图标或者其他桌面组件。
未完待续···