在Android中,通常Zygote fork进程之后,并不直接由Zygote通知AMS启动应用,而是通过一个更为复杂的流程。下面是详细的步骤和它们之间的通信:
- AMS 请求 Zygote 创建新进程
当Activity Manager Service (AMS) 决定需要为某个应用启动一个新进程时,它向Zygote发送一个请求。通信通常通过socket完成,AMS与Zygote通信使用特定的协议来传递创建新进程所需要的参数,如应用的包名、用户ID(UID)、初始类等。
- Zygote Fork进程
根据从AMS接收到的信息,Zygote进程执行fork操作。这是通过复制它自身的进程映像来完成的,创建出一个新的进程。新的进程继承了Zygote的文件描述符和已加载的系统类库,并会加载应用特定的类和资源。
- 新进程的初始化
一旦进程被创建,它会进行自我初始化。这包括创建一个新的ActivityThread实例,该实例管理应用的主要运行循环。在这个阶段,新的进程还会设置自己的应用环境,加载应用特定的数据和代码。
- ActivityThread与AMS的通信
新创建的进程中的ActivityThread会向AMS注册自己,通常是通过Binder IPC。在这个阶段,ActivityThread告诉AMS它已经成功启动并准备就绪。这一步是通过调用attachApplication()方法实现的,该方法由AMS在新进程的主线程上调用。
- AMS 调度Activity启动
完成进程的注册后,AMS控制新的Activity启动,它将调用新进程中的ActivityThread的handleLaunchActivity()来开始Activity的启动流程。这通常涉及到调用Activity的onCreate(), onStart(), 和onResume()等生命周期方法。
- Activity 运行
一旦ActivityThread完成Activity的创建和初始化,Activity就处于运行状态,用户可以与之交互了。
在整个过程中,AMS、Zygote和新创建的进程之间的通信主要通过以下方式进行:
Socket通信:用于AMS与Zygote之间的交流,包括发送创建新进程的请求。
Binder IPC:用于新的应用进程与AMS之间的交流,包括状态更新、进程注册、启动Activity等