ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] ### 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 进行通信。 过程大致如下: ![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20200304103823.png) [Android世界之盘古女娲——Zygote](https://blog.csdn.net/chz429/article/details/87514718?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task) ### 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启动模式详解](https://www.jianshu.com/p/94816e52cd77) ### ActivityStackSupervisor AMS 通过 ActivityStackSupervisor 操作 ActivityStack ### ApplicationThread 是 ActivityThread 的一个内部类,继承于 `IApplicationThread.Stub` ,可以看出是一个 Binder 对象,是 AMS 向 ActivityThread 通信的桥梁。 ### ActivityThread 表示 App 主线程,有静态 main 入口函数 ### ClientLifecycleManager 调用ClientTransaction,让 AMS 切换到 APP 进程执行生命周期