基于Android7.1源码
init.rc文件解析
解析init.rc
文件,执行对应的app_main.cpp
,在main
方法中
- 通过
AndroidRuntime.cpp
启动 Dalvik虚拟机 ZygoteInit.java
作为虚拟机执行的入口ZygoteInit.java
执行完毕后,孵化出第一个进程:system_server进程
init.rc
文件其实就是指定了app_main.cpp
的启动参数,在init.rc
也将app_main.cpp
更名为zygote
ZygoteInit.java执行
主要是执行main
函数,主要包括三个部分:
开启Socket服务端
在ZygoteInit.java
的main
方法中,会开启一个Socket的服务端口,在一个while(true)
的循环当中通过poll
监听文件描述符,这是一种非阻塞的IO端口方式。
有客户端连接时,调用ZygoteConnection
的runOnce
方法,该方法的核心是基于zygote进程孵化出新的应用进程。
客户端创建的Socket,在
Process
类的start()
方法中。该方法是个静态方法,会由AMS类中的方法startProcessedLocked()
调用。
这里要注意的是,孵化新进程的方式是通过fork
的形式,由于fork出的子进程是父进程的副本,有着和父进程一样的数据空间、堆、栈等,所以也会有一个Socket服务端。因此根据fork出的进程pid判断出子进程(pid == 0),关闭服务端Socket,并调用新进程指定的Class文件的main函数,即ActivityThread的main函数。
加载系统资源
系统资源主要对应于:framework.jar、/base/core/res/values/arrays.xml
启动system_server进程
调用startSystemServer
方法,在该方法内部调用Zygote.forkSystemServe()
基于Zygote进程fork 出system_server进程。
fork出新进程后,即pid==0表示的进程,在handleSystemServerProcess()
方法中,会关闭掉Socket服务端,并调用SystemServer
的main函数。
后面就是由SystemServer来启动各个系统服务:AMS、WMS、PMS等。