![](https://img-blog.csdnimg.cn/20210704135018776.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0J1bm55Q29mZmVy,size_16,color_FFFFFF,t_70)
流程顺序:
开机 -> BootLoader(引导芯片) -> Linux Kernel -> init进程 -> JVM和SystemServer等 -> Binder线程池 和 SystemServerManager -> Launcher?
思维导图:
![](https://img-blog.csdnimg.cn/20210704164528923.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0J1bm55Q29mZmVy,size_16,color_FFFFFF,t_70)
口述表达:
整个的开机流程,分为两个阶段,第一阶段为Linux的启动过程,第二个阶段为android的启动流程。
Linux的启动过程:
1)首先是用户点击开机键,芯片开始执行ROM中的预存代码
2)然后引导程序(BootLoader)将操作系统映像文件拷贝到RAM中去,引导程序开始初始化硬件参数,然后启动操作系统。
3)接着引导程序会初始化Kernel,加载内核到内存中。
4)start_kernel会最终启动用户空间的init进程。
Android的启动过程:
5)当初始化内核之后,就会启动一个相当重要的祖先进程,也就是init进程,在Linux中所有的进程都是由init进程直接或间接fork出来的。init进程负责创建系统中最关键的几个核心daemon(守护)进程,尤其是zygote和servicemanager。前者是android启动的第一个dalvik 虚拟机,它将负责启动Java世界的进程;后者是BInder通信的基础。换句话说, init进程负责解析init.rc配置文件,开启系统守护进程。两个最重要的守护进程是zygote进程和servicemanager
6)当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出来的。
7)在SystemServer进程开启的时候,就会初始化ActivityManagerService 。同时,会加载本地系统的服务库,调用createSystemContext()创建系统上下文,创建ActivityThread及开启各种服务等等。也就是说在system_server中开启了核心系统服务,并将系统服务添加到ServiceManager中,然后系统进入SystemReady状态。
8)上面ActivityManagerService 开启之后,会调用finishBooting() ,完成引导过程,同时发送开机广播。ActivityManagerService会与zygote的Socket通信,请求启动Home。zygote收到AMS的连接请求后,zygote处理请求会通过fork启动新的应用进程,并最终启动Home。,完成系统界面的加载与显示。 ?
|