android activitythread启动流程,Android面试Activity的启动流程

Zygote是Android系统中的关键进程,它是所有应用的父进程,由init进程fork创建。Zygote启动虚拟机,加载系统资源并初始化,然后孵化system_server进程。system_server包含AMS、WMS等核心服务,支持Binder通信。AMS负责管理四大组件,Instrumentation协调Activity生命周期,ActivityStackSupervisor管理Activity启动模式。整个流程涉及Android系统的进程孵化、服务启动和组件调度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 进行通信。

过程大致如下:

223193171_1_20210530100016317.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值