轻松理解Android应用启动流程
每次看APP启动流程,都是看源码。每次看懂了又不能长久记忆,这次我想尝试一下用通俗易懂的方式梳理一下Android应用启动流程。
本文将会从如下几个方面进行介绍:
- zygote进程
- SystemServer进程
- ActivityManagerService服务
- App进程
- Activity的启动
1. 基本概念介绍
1.1 Zygote进程和SystemServer进程
关于Zygote和Systemserver进程都是怎么来的,可以参考一下:理解Android系统启动之Init、Zygote、SystemServer
Zygote小结:
- 安卓系统上电,系统启动,首先创建的是init进程,init进程读取一些配置,根据配置创建zygote进程
- zygote进程主要干了四件事: a. 启动DVM虚拟机 b. 注册JNI函数 c. 注册Socket d. 通过fork创建SystemServer进程
SystemServer小结:
- 基于fork创建的进程会复制Zygote进程的地址空间,所以也会有Zygote进程中创建的Socket,SystemServer进程并不需要此Socket,因此需要关闭该Socket
- 创建PathClassLoader,用于类加载
- 启动Binder线程池,用于进程间通信
- 创建Looper
- 创建SystemServiceManager,用来管理本地服务
- 启动本地服务,并添加到SystemServiceManager中,其中包括AMS(ATMS)、PowerManagerService、PMS、DropBoxManagerService、BatteryService、UsageStatsService、WebViewUpdateService、CameraService、AlarmManagerService、InputManagerService、WindowManagerService等服务
- 启动Looper,提供服务
零散知识点:
- Binder在SystemServer中启动的,Zygote是Socket通信
2. 启动流程
2.1 相关类介绍
- ActivityThread:整个 App main 方法所在的类,所谓主线程就是指它所执行的线程,所以通常会称其为主线程。它负责管理应用程序进程的主线程的执行,处理 ATMS 的调度和执行Activity,Broadcast及相关操作。
- ApplicationThread:它是 ActivityThread 的一个内部类,继承自 IApplicationThread.Stub,是一个 IBinder。ActivityThread 通过它来进行 IPC 调用,与 SystemServer 通信,调用ActivityThread的方法后它会发送Message给主线程的Looper执行。
- Intrumentation:用于监控应用程序与系统交互,启动 Activity 或者调用 Activity、Application 的生命周期都需要经过它的处理。
- ActivityTaskManager:Activity,Service 等与 ATMS 跨进程交互的接口,ATMS的辅助类。后文简称为 ATM。
- ActivityTaskManagerService:管理 Activity 和它的回退栈、任务栈的系统服务,Android 10以前是 AMS 的工作,Android 10中将部分工作从 AMS 抽离为 ATMS。后文将简称为 ATMS。
- ActivityRecord:system_server进程中用来描述Activity的数据类型。ActivityRecord中存储了Activity的信息,如所在的进程名称,应用的包名,所在的任务栈的taskAffinity等,与ActivityClientRecord、Activity的是一一对应关系。
- ActivityClientRecord:App进程中用来描述Activity的数据类型。
- TaskRecord:表示一个任务栈,记录了Activity启动的先后顺序,栈中严格按照先进后出的特性维护一系列ActivityRecord。
- ActivityStack:负责维护TaskRecord,内部保存了当前Stack中所有的Task列表。
- ActivityDisplay:管理所有ActivityStack,表示当前屏幕的抽象,内部维护了mHomeStack、mStacks、mPreferredToFocusableStack和mLastFocusedStack等ActivityStack。
- RootActivityContainer:Android10中新增的类,由ActivityStackSupervisor中抽离而来,其作为Activity容器的根节点,负责管理所有的ActivityDisplay。
- ActivityStackSupervisor:Android系统中Activity的最大管家,通过持有RootActivityContainer来间接管理所有的Activity。
- ClientLifecycleManager:组合多个客户端生命周期转换和请求,作为单个事务来执行。
2.2 Launcher 和 Activity 跳转流程
2.2.1 Launcher启动流程
- Launcher点击图标,查询要点击的App的信息
- 携带信息给AMS,AMS判断该App进程是否已经启动。如果进程已经启动,打开该Activity,否则先启动App进程,再打开该Activity。
2.2.2 Activity跳转Activity流程
- 把要跳转的Activity信息给AMS,AMS创建并打开Activity
小结:
- Launcher 和 Activity 跳转到 Activity 都需要经过AMS
- Launcher跳转为 Launcher -> Launcher进程ActivityThread -> AMS -> 启动目标进程 -> 目标进程ActivityThread -> 目标Activity
- Activity跳转为 Activity -> 当前进程ActivityThread -> AMS -> 当前进程ActivityThread -> 目标Activity
2.3 如何启动目标进程?
前情提要:AMS运行在SystemServer进程,它与外界通信要通过Binder的方式
- 通过socket通知Zygote进行fork,此时就创建了目标进程
- 目标进程进行初始化工作,通过反射调用ActivityThread的main方法
- 目标进程启动完成后,通过ActivityThread->ApplicationThread->Handler 创建Application并调用Appliction的onCreate方法
2.4 ActivityThread的main方法做了什么?
- 创建Looper
- 创建ActivityThread对象并调用attach方法
- 将自己的代理对象ApplicationThread传递给AMS供AMS进行生命周期管理
- Looper循环
3. Activity跳转Activity生命周期变换
- 正常ActivityA->正常ActivityB->正常ActivityC
E/---->: Main1:onCreate
E/---->: Main1:onStart
E/---->: Main1:onResume
E/---->: Main1:onPause
E/---->: Main2:onCreate
E/---->: Main2:onStart
E/---->: Main2:onResume
E/---->: Main1:onStop
E/---->: Main2:onPause
E/---->: Main3:onCreate
E/---->: Main3:onStart
E/---->: Main3:onResume
E/---->: Main2:onStop
回退
E/---->: Main3:onPause
E/---->: Main2:onRestart
E/---->: Main2:onStart
E/---->: Main2:onResume
E/---->: Main3:onStop
E/---->: Main3:onDestroy
E/---->: Main2:onPause
E/---->: Main1:onRestart
E/---->: Main1:onStart
E/---->: Main1:onResume
E/---->: Main2:onStop
E/---->: Main2:onDestroy
2.正常ActivityA->透明ActivityB->正常ActivityC
E/---->: Main1:onCreate
E/---->: Main1:onStart
E/---->: Main1:onResume
E/---->: Main1:onPause
E/---->: Main2:onCreate
E/---->: Main2:onStart
E/---->: Main2:onResume
E/---->: Main2:onPause
E/---->: Main3:onCreate
E/---->: Main3:onStart
E/---->: Main3:onResume
E/---->: Main1:onStop
E/---->: Main2:onStop
回退
E/---->: Main3:onPause
E/---->: Main1:onRestart
E/---->: Main1:onStart
E/---->: Main2:onRestart
E/---->: Main2:onStart
E/---->: Main2:onResume
E/---->: Main3:onStop
E/---->: Main3:onDestroy
E/---->: Main2:onPause
E/---->: Main1:onResume
E/---->: Main2:onStop
E/---->: Main2:onDestroy
4. 其他知识点
1. ContentProvider的onCreate方法会在Application创建之后,Application onCreate方法调用之前调用