进程fork好之后到启用应用,他们之间做了哪些通信?

2024-06-24  本文已影响0人  忧零520

在Android中,通常Zygote fork进程之后,并不直接由Zygote通知AMS启动应用,而是通过一个更为复杂的流程。下面是详细的步骤和它们之间的通信:

  1. AMS 请求 Zygote 创建新进程

当Activity Manager Service (AMS) 决定需要为某个应用启动一个新进程时,它向Zygote发送一个请求。通信通常通过socket完成,AMS与Zygote通信使用特定的协议来传递创建新进程所需要的参数,如应用的包名、用户ID(UID)、初始类等。

  1. Zygote Fork进程

根据从AMS接收到的信息,Zygote进程执行fork操作。这是通过复制它自身的进程映像来完成的,创建出一个新的进程。新的进程继承了Zygote的文件描述符和已加载的系统类库,并会加载应用特定的类和资源。

  1. 新进程的初始化

一旦进程被创建,它会进行自我初始化。这包括创建一个新的ActivityThread实例,该实例管理应用的主要运行循环。在这个阶段,新的进程还会设置自己的应用环境,加载应用特定的数据和代码。

  1. ActivityThread与AMS的通信

新创建的进程中的ActivityThread会向AMS注册自己,通常是通过Binder IPC。在这个阶段,ActivityThread告诉AMS它已经成功启动并准备就绪。这一步是通过调用attachApplication()方法实现的,该方法由AMS在新进程的主线程上调用。

  1. AMS 调度Activity启动

完成进程的注册后,AMS控制新的Activity启动,它将调用新进程中的ActivityThread的handleLaunchActivity()来开始Activity的启动流程。这通常涉及到调用Activity的onCreate(), onStart(), 和onResume()等生命周期方法。

  1. Activity 运行

一旦ActivityThread完成Activity的创建和初始化,Activity就处于运行状态,用户可以与之交互了。
在整个过程中,AMS、Zygote和新创建的进程之间的通信主要通过以下方式进行:

Socket通信:用于AMS与Zygote之间的交流,包括发送创建新进程的请求。

Binder IPC:用于新的应用进程与AMS之间的交流,包括状态更新、进程注册、启动Activity等

上一篇 下一篇

猜你喜欢

热点阅读