Android面试Activity的启动流程

Zygote

Zygote 是什么?

Zygote 在 Android 系统中是一个 native 进程,是 Android 系统上所有应用的父进程,我们系统上的 App 都是通过 Zygote 进程 fork 出来的,而 Zygote 进程则是由 Linux 系统用户空间的第一个进程 init 进程通过 fork 的方式创建的。(init 进程是手机开机以后的第一个进程)

Zygote 的作用是什么?

  1. 启动 system_server 进程

  2. 孵化应用进程

Zygote 是怎么启动的?

  1. init 进程 fork 出 Zygote 进程

  2. 启动虚拟机,注册 JNI 函数

  3. 加载系统资源,一系列初始化(包括系统资源,openGL,webView等)

  4. 启动 system_server 进程

  5. 进入 socket 连接的 loop

需要注意的是,Zygote 进程使用的是 socket 通信,还没有使用 Binder 进行通信。
过程大致如下:

Android世界之盘古女娲——Zygote

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 进程执行生命周期

(0)

相关推荐