Android系统启动过程简析

313 阅读1分钟

基于Android7.1源码

init.rc文件解析

解析init.rc文件,执行对应的app_main.cpp,在main方法中

  1. 通过AndroidRuntime.cpp启动 Dalvik虚拟机
  2. ZygoteInit.java作为虚拟机执行的入口
  3. ZygoteInit.java执行完毕后,孵化出第一个进程:system_server进程

init.rc 文件其实就是指定了app_main.cpp的启动参数,在init.rc也将app_main.cpp更名为zygote

ZygoteInit.java执行

主要是执行main函数,主要包括三个部分:

开启Socket服务端

ZygoteInit.javamain方法中,会开启一个Socket的服务端口,在一个while(true)的循环当中通过poll监听文件描述符,这是一种非阻塞的IO端口方式。

有客户端连接时,调用ZygoteConnectionrunOnce方法,该方法的核心是基于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等。