Android启动时到底发生了什么?
2023-10-01 01:56:22
当你按下设备的电源键时,一个名为 "开机自检"(POST)的进程会首先启动,负责初始化硬件并加载引导加载程序。引导加载程序会加载内核和 Android 系统镜像,然后启动 init 进程,它是 Android 系统的第一个用户空间进程。init 进程会启动系统服务,如 Zygote 进程、Activity 管理器和 Window 管理器。Zygote 进程负责创建和管理 Android 应用进程。Activity 管理器负责管理应用的生命周期,而 Window 管理器负责管理窗口和输入事件。
当用户启动应用程序时,Activity 管理器会为该应用程序创建新的进程。应用程序的进程会通过 Zygote 进程复制而来,Zygote 进程是Android启动时应用程序主进程的祖先进程。Zygote 进程提前加载并初始化常用的类库,为应用程序的进程提供更高效的启动性能。Zygote 进程创建后一直存在,当需要创建新的应用程序进程时,Zygote 进程会通过fork一个新的进程,创建新的进程来继承自身,成为新进程的父进程。
在应用程序的进程中,Android 系统会调用应用程序的 Application 对象的 onCreate() 方法,然后调用 Activity 的 onCreate() 方法。Activity 的 onCreate() 方法负责创建并初始化 Activity 的布局,以及为用户提供交互界面的 View。Activity 的布局是由 XML 文件定义的,当应用程序启动时,Android 系统会将 XML 文件解析为 View 对象。View 对象是 Android 系统中用于表示用户界面的基本构建块。
当 View 对象被创建后,Android 系统会调用 View 的 onDraw() 方法。onDraw() 方法负责绘制 View 的内容。View 的内容由 View 本身决定,例如,一个 TextView 对象会绘制文本,而一个 ImageView 对象会绘制图像。View 的绘制过程涉及到一系列的步骤,包括测量 View 的大小和位置、计算 View 的绘制区域、将 View 的内容绘制到缓冲区中、将缓冲区中的内容绘制到屏幕上等。
在 View 的绘制过程中,Android 系统会使用 Choreographer 类来同步刷新信号的处理。Choreographer 类负责管理屏幕上的动画和刷新操作。当 Android 系统检测到屏幕需要刷新时,它会向 Choreographer 发送一个刷新信号。Choreographer 会将刷新信号传递给 ViewRootImpl 类,ViewRootImpl 类负责管理应用程序的窗口并协调 View 的绘制。
ViewRootImpl 类收到刷新信号后,会调用 View 的 dispatchDraw() 方法。dispatchDraw() 方法负责遍历 View 树并调用每个 View 的 onDraw() 方法,将 View 的内容绘制到屏幕上。View 的绘制过程是一个递归的过程,View 的子 View 会在其父 View 的 onDraw() 方法中被绘制。
当 View 的绘制过程完成后,Android 系统会将屏幕上的内容显示给用户。从应用程序的启动到第一帧动画的绘制,涉及到一系列复杂的步骤,Android 系统通过优化这些步骤来确保应用程序能够快速启动并流畅运行。