1. 分析背景
可以根据 Activity 的启动时机,从两个方面入手:
- 根 Activity 的启动流程: 又叫应用程序启动流程,即点击桌面上某一个应用图标到应用第一个 Activity 展示出来的流程。
- 普通 Activity 的启动流程: 即应用内启动一个 Activity 到展示出来的流程。
由于两种启动流程是有重叠的,根 Activity 的启动流程更复杂,所以下面我们基于 Android R(11.0) 重点分析根 Activity 的启动流程
而普通 Activity 的启动流程在涉及的地方会稍微提一下。
应用的启动流程大致分为下面五个阶段: 一、应用启动进程 Launcher 调用 ATMS 系统进程的过程
二、ATMS 向 AMS 发送创建应用进程的过程
三、AMS 向 Zygote 进程发送创建应用进程 ActivityThread 的过程
四、Zygote 进程接收请求 fork 并启动应用进程 ActivityThread 的过程
五、应用进程 ActivityThread 启动 Activity 的过程
2. 应用启动进程 Launcher 调用 ATMS 系统进程的过程
Launcher 是一个用于显示所有应用程序的一个系统级别的应用程序,也就是我们常说的桌面,通过 PackageManagerService 来获取已安装的所有应用程序信息。实际上就是一个 Activity,由 AMS(ActivityManagerService)来管理进程调度与启动,AMS 是 Android 中最核心的系统服务,几乎所有的应用都需要与 AMS 通信。根 Activity 的启动流程其实就是点击 Launcher 中某一个应用图标到应用第一个 Activity 展示出来的流程,当系统开机后,Launcher 也会被 AMS 启动,然后将已经安装的应用程序图标显示到桌面上,所以当我们点击一个应用图标其实就是相当于点击 Activity 中的一个 Button,其相应事件就是 Launcher 进程请求 ATMS 来启动该应用程序。
3. ATMS 向 AMS 发送创建应用进程的过程
system_server 进程中 startBootstrapServices() 方法启动系统引导服务,引导服务中启动了 ATMS(ActivityTaskManagerServici)、AMS 等服务,其中 ATMS 是 Android 10 中新增的,本来都是 AMS 来管理,Google 考虑到 AMS 职责太多、代码太庞大,所以单独拆出来 ATMS 用于管理 Activity及其容器类,如 Task、Stack、Display 等,分担 AMS 部分职责。