Android系统启动简要流程

249 阅读2分钟

基于Android 8.0.0_r1源码,主要目的明白大概的流程。

init进程fork Zygote进程

init进程启动:

1:通电加载 BootLoader
2:BootLoader启动Linux内核
3:内核启动init进程

init进程fork Zygote进程:

1:init进程加载init.rc配置文件
2: init进程通过fork + execve方式创建 Zygote进程

创建进程有两种方式:
1:fork + handle 默认继承父进程的所有资源
2:fork + execve 继承的资源会被清掉

Zygote进程

Zygote进程的主要作用:孵化应用进程和启动SystemServer进程。
Zygote的具体做了什么工作呢?
1:启动虚拟机
2:为虚拟机注册JNI方法
3:通过JNI调用java从而从Native层进入Java层
4:创建一个Socket。这个很重要它配合Loop循环等待AMS的请求创建新的应用进程。
5:预加载类和资源。
6:启动SystemServer进程。
7:调用runSelectLoop方法等待AMS的请求创建新的应用进程。

启动SystemServer进程

Zygote调用ZygoteInit中的startSystemServer方法启动。此方法中给SystemServer进程的用户ID和用户组ID设置为1000,进程名为system_server。最终调用nativeForkSystemServer方法来fork一个SystemServer进程。

以进程启动三段式来总结Zygote进程做的工作
进程启动:init进程调用AppRunntime的start方法启动Zygote进程
准备工作:创建虚拟机,注册JNI函数,进入java层,创建Socket并启动SystemServer进程。
LOOP   :启动Loop循环等待AMS的请求创建新的应用进程。

Zygote fork子进程是单线程的,它会把除fork线程之外的线程全部停掉。

SystemServer进程

SystemServer主要作用是:创建系统服务。如AMS,WMS,PMS等。

具体工作:
1:启动Binder线程池,这样就可以和 其他进程通信。
2:创建SystemServiceManager来管理系统的服务。
3:启动各种系统服务。

启动Launcher

启动Launcher是系统启动流程的最后一步。

Launcher是什么:它是一个App(桌面),一个用来显示和启动系统中已经安装的应用程序。 Launcher启动:AMS启动后调用systemReady方法来启动Launcher(此处先不详细分析,这个流程和启动应用程序流程重合,以后再详解)。