Android面试Activity的启动流程
Zygote
Zygote 是什么?
Zygote 在 Android 系统中是一个 native 进程,是 Android 系统上所有应用的父进程,我们系统上的 App 都是通过 Zygote 进程 fork 出来的,而 Zygote 进程则是由 Linux 系统用户空间的第一个进程 init 进程通过 fork 的方式创建的。(init 进程是手机开机以后的第一个进程)
Zygote 的作用是什么?
启动 system_server 进程
孵化应用进程
Zygote 是怎么启动的?
init 进程 fork 出 Zygote 进程
启动虚拟机,注册 JNI 函数
加载系统资源,一系列初始化(包括系统资源,openGL,webView等)
启动 system_server 进程
进入 socket 连接的 loop
需要注意的是,Zygote 进程使用的是 socket 通信,还没有使用 Binder 进行通信。
过程大致如下:
system_server
system_server 进程是系统启动以后 Zygote 创建的第一个进程,在其中有很多系统提供的服务,比如 AMS(ActivityManagerService)、WMS(WindowManagerService)、PWS(PackageManagerService)等等。
在 Zygote 内部的 startSystemServer() 中启动 system_server 进程,方法内通过抛出异常,然后捕获异常的技巧,使得 system_server 进程跳过了 Zygote 进程的后续步骤进入 system_server 的 java 世界,这些步骤包括使得Zygote进入无限循环的runSelectLoopMode()方法。
其中 system_server 有个重要的特点是,它支持的使用 Binder 进行进程间通信,它已经进入了 Binder 的世界,不用跟 Zygote 进程一样使用 Socket。
另一个特点是,system_server是和zygote共存亡的,只要system_server被杀死,zygote也会把自己杀掉,这就导致了系统的重启。
AMS (ActivityManagerService)
AMS 是 Android 中最核心的服务,主要负责系统中四大组件的启动、切换、调度以及应用程序的管理和调度工作,其职责与操作系统中的进程管理和调度模块相类似,因此它在Android中非常重要。
AMS 运行在 system_server 中,所以我们可以通过 Binder 通信来和 system_server 进程进行进程间通信。
Instrumentation
每个应用程序都有一个 Instrumentation 对象,每个 Activity 持有它的引用,ActivityThread要创建和暂停 Activity 时,都是通过 Instrumentation 实现。
ActivityStarter
负责处理 Intent 、Flag、选择启动的 Task、复用 Activity 等逻辑
ActivityRecord
每个 Activity 在 AMS 中都有一个对应的 ActivityRecord,记录 Activity 的信息
TaskRecord
就是我们所讲的任务栈、先进后出、存储 ActivityRecord
ActivityStack
用来管理TaskRecord ,ActivityStack 是由 ActivityStackSupervisor 创建的。
ActivityRecord、TaskRecord、ActivityStack以及Activity启动模式详解
ActivityStackSupervisor
AMS 通过 ActivityStackSupervisor 操作 ActivityStack
ApplicationThread
是 ActivityThread 的一个内部类,继承于 IApplicationThread.Stub
,可以看出是一个 Binder 对象,是 AMS 向 ActivityThread 通信的桥梁。
ActivityThread
表示 App 主线程,有静态 main 入口函数
ClientLifecycleManager
调用ClientTransaction,让 AMS 切换到 APP 进程执行生命周期