Android 应用冷启动流程深度解析
一、前言
当我们点击手机桌面上的应用图标,到手机桌面显示出应用主 Activity 界面而完成应用启动,看似很简单的过程其实包含了复杂的底层交互。整个启动过程,涉及了 Android 系统的很多核心知识点,包括进程管理、Binder 通信、虚拟机初始化以及 UI 渲染机制。
二、启动过程简介
首先,手机桌面本身就是一个 APP 应用,名称叫 Launcher,是手机厂商提供的,不同的手机厂商开发出了一套自己 UI 风格的展示桌面。我们点击 Launcher 桌面的 APP 应用图标,可以打开其他的 APP 应用。
APP 应用的启动过程,分为冷启动和热启动两种:
- 冷启动:APP 应用进程未启动,系统会 fork 出一个子进程来加载 APP 应用的 Application 并启动 Activity,这种启动方式就是冷启动。
- 热启动:APP 应用进程已启动,已在后台运行。系统的所有工作就是将 APP 应用的 Activity 带到前台展示。
冷启动是应用完全从 0 开始启动,涉及到更多的内容,所以我们就从 APP 应用的冷启动过程展开讨论。
三、启动过程分析
一般来说,冷启动包括以下几个关键步骤:
1. 启动 APP 进程
当我们点击 Launcher 桌面程序的 APP 图标时,Launcher 程序会调用 startActivity() 函数,通过 Binder 跨进程通信,发送消息给 system_server 进程。在 system_server 进程中,由 AMS(ActivityManagerService)通过 socket 通信告知 Zygote 进程 fork 出一个子进程(APP 进程)。
2. 开启 APP 主线程
APP 进程启动后,会实例化一个 ActivityThread,并执行其 main 函数,同时会创建 ApplicationThread、Looper、Handler 对象,开启主线程消息循环 Looper.loop()。
3. 创建并初始化 Application 和 Activity
ActivityThread 的 main 函数通过调用 attach 方法进行 Binder 通信,通知 system_server 进程执行 AMS 的 attachApplication 方法。在 attachApplication 方法中,AMS 分别通过 bindApplication、scheduleLaunchActivity 方法,通知 APP 进程的主线程 Handler,对 APP 进程的 Application 和 Activity 进行初始化,并执行 Application、Activity 的生命周期。
4. UI 布局和绘制
主线程 Handler 初始化 Activity 时,会执行创建 PhoneWindow、初始化 DecorView 的操作,并且添加布局到 DecorView 的 ContentView 中。ContentView,对应着 Activity 的 setContentView 中设置的 layout.xml 布局文件所在的最外层父布局。Android 视图层次结构如下所示:

至此,应用启动流程完成。下面对源码细节做进一步分析。



