Android:开机启动流程分析
开机流程顺序:
开机->BootLoader(引导芯片)->Linux Kernel(init.rc)->init进程,id为1->zygote进程(dalvik虚拟机)->JVM和SystemServer等->Binder线程池(启动核心系统服务,SSM/AMS等)->Launcher
整个开机流程分析:分为两个阶段(1、Linux启动过程;2、Android启动过程)
1、Linux启动过程:
1)首先用户点击开机键,引导芯片执行Rom中的预存代码,然后加载引导程序到Ram中(操作系统映像文件拷贝)。
2)引导程序启动后,开始初始化硬件参数,然后启动操作系统。
3)紧接着引导程序会初始化Kernel,加载内核到内存中,然后(start_kernel)启动用户空间的init进程。
2、Android启动过程:
4)当初始化内核后,就会启动一个相当重要的进程,也就是init进程。在Linux中所有的进程都是由init进程直接或间接fork出来的,init进程负责创建系统中最关键的几个核心daemon(守护进程),尤其是zygote进程(Android启动的第一个Dalvik虚拟机)和servicemanager(系统服务管理,Binder通信基础)。前者描述可见是Android启动的第一个dalvik虚拟机,它将负责启动Java世界的进程;后者是Binder通信的基础。换句话说,init进程负责init.rc配置文件,开启系统守护进程。两个重要的守护进程是zygote进程和servicemanager进程。
5)当init进程创建之后,会fork出一个Zygote进程,这个进程是所有Java进程的父进程。在zygote开启的时候,会调用ZygoteInit.main()进行初始化。zygote虚拟机启动子进程system_server,同时也可以看出zygote中定义了一个Socket,用于接收ActivityManagerService启动应用程序的请求。前面ZygoteInit.java里面通过startSystemServer() fork出了SystemServer进程,这个进程在整个的Android中非常重要,它和Zygote进程一样,是Android Framework层的两大重要进程。系统里面重要的服务都是在这个进程里面开启的,例如AMS, WindowsManager, PackageManagerService等等都是由这个SystemServer fork出来的。
6)在SystemServer进程开启的时候,就会初始化ActivityManagerService 。同时,会加载本地系统的服务库,调用createSystemContext()创建系统上下文,创建ActivityThread及开启各种服务等等。也就是说在system_server中开启了核心系统服务,并将系统服务添加到ServiceManager中,然后系统进入SystemReady状态。
7)上面ActivityManagerService 开启之后,会调用finishBooting() ,完成引导过程,同时发送开机广播。ActivityManagerService会与zygote的Socket通信,请求启动Home。zygote收到AMS的连接请求后,zygote处理请求会通过fork启动新的应用进程,并最终启动Home,完成系统界面的加载与显示。
本文来自博客园,作者:include_chen,转载请注明原文链接:https://www.cnblogs.com/include-chen/p/16415512.html