复杂的 Android 系统它是怎样运行起来的,App 又是怎样加载呈现在屏幕上的呢?本文通过5个关键过程图示讲述 Android 系统的启动流程。
一 init进程启动图
1.启动电源以及系统启动
当电源按下时引导芯片代码从预定义的地方(固化在ROM)开始执行。加载引导程序BootLoader到RAM中,然后执行。
2.引导程序BootLoader
引导程序BootLoader是在Android操作系统开始运行前的一个小程序,它的主要作用是把系统OS拉起来并运行。
3.Linux内核启动
当内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。在内核完成系统设置后,它首先在系统文件中寻找init.rc文件,并启动init进程。
4.init进程启动
init进程做的工作比较多(1)创建和挂载启动所需的文件目录。(2)初始化和启动属性服务。(3)解析init.rc配置文件并启动Zygote进程。
二 Zygote进程启动图
init进程fork出Zygote进程后,Zygote进程会创建一个服务端socket,等待AMS发起socket请求。Zygote进程fork出的SystemServer进程会启动各项系统服务。Zygote进程启动共做了如下几件事:
1.创建AppRuntime并调用其start方法,启动Zygote进程。
2.创建Java虚拟机并为Java虚拟机注册JNI方法。
3.通过JNI调用ZygoteInit的main函数进入Zygote的Java框架层。
4.通过registerZygoteSocket方法创建服务器端Socket,并通过runSelectLoop方法等待AMS的请求来创建新的应用程序进程。
5.启动SystemServer进程。
三 系统服务启动图
SystemServer进程被创建后,主要做了如下工作:
1.启动Binder线程池,这样就可以与其他进程进行通信。
2.创建SystemServiceManager,其用于对系统的服务进行创建、启动和生命周期管理。
3.启动各种系统服务。
不管是由init进程启动的独立进程的系统服务如SurfaceFlinger,还是由SystemServer进程启动的非独立进程的系统服务如AMS,都是在ServiceManager进程中完成注册和获取的,在跨进程通信上使用了Android的binder机制。
四 应用启动图
首先Launcher进程向AMS请求创建根Activity,AMS会判断根Activity所需的应用程序进程是否存在并启动,如果不存在就会请求Zygote进程创建应用程序进程。应用程序进程启动后,AMS 会请求创建应用程序进程并启动根Activity。步骤2采用的是Socket通信,步骤1和步骤4采用的是Binder通信。
根Activity启动过程中涉及的进程之间的关系
五 窗口显示图
window的添加过程通过windowmanager的
addview-Windowmanagerglobal的addview-viewrootimpl的setview-requestlayout-sheduletraversals-接着通过Windowssession来完成window的添加过程
1. 视图设置和布局请求
- setView 方法的调用:应用程序要显示或更新界面时,它会通过设置一个视图(如Activity的内容视图)来开始这个过程
- requestLayout 方法的调用:如果视图的结构发生变化就会调用 requestLayout 方法。这个方法标记了视图树需要重新布局和测量
2. 窗口管理和渲染
- WMS:WMS 负责处理窗口的创建、大小位置的更新、层次管理等。WMS 为新窗口分配 Surface(即绘制窗口内容的画布),并管理窗口在屏幕上的显示次序。
- SurfaceFlinger:SurfaceFlinger 负责将来自不同窗口的 Surface 合成,然后将最终的图像渲染到屏幕上。
View的绘制流程
ViewRootImpl与WMS通信