Android Activity启动机制:四进程协同的生命之旅

389 阅读2分钟

一句话总结

Activity 的创建像一场接力赛:Launcher 发令SystemServer 指挥Zygote 造人App 进程干活,四棒交接完成初始化!


一、Launcher进程(第一棒:启动指令的发出者)

角色:桌面 App。

当用户点击一个应用图标时,Launcher 进程会构建一个 Intent 对象。Intent 中包含了要启动的 Activity 的信息。Launcher 随后通过 Binder IPC(进程间通信) 将这个 Intent 发送到 SystemServer 进程中的 ActivityManagerService (AMS)


二、SystemServer进程(第二棒:全局调度的核心)

角色:Android 系统的核心服务进程,其中运行着 AMS、PackageManagerService 等关键服务。

SystemServer 是 Activity 启动过程的“总指挥”。它接收到 Intent 后,会执行以下关键操作:

  1. 权限检查:验证启动请求的合法性。

  2. 进程判断:检查目标应用是否已经运行。

    • 如果应用进程不存在,SystemServer 会通过 SocketZygote 进程发送指令,请求创建一个新的进程。
    • 如果应用进程已存在,SystemServer 会直接通过 Binder 向该进程发送启动 Activity 的指令。

三、Zygote进程(第三棒:App进程的孵化器)

角色:Android 的“模板工厂”,预加载了所有公共库和资源。

Zygote 进程收到指令后,会执行其最核心的操作:

  1. fork 系统调用Zygote 复制自身,生成一个新的子进程。这个过程采用了写时复制(Copy-on-Write) 技术,使得新进程可以快速启动并共享 Zygote 的内存。
  2. 主线程入口:在新的进程中,Zygote 会执行 ActivityThread.main() 方法,这标志着App 主线程的正式诞生

四、App进程(第四棒:Activity的创建与显示)

角色:新创建的应用进程,其主线程运行着 ActivityThread

这是整个启动流程的最后一棒,也是开发者最熟悉的环节:

  1. 进程初始化:主线程首先初始化其消息循环系统(LooperMessageQueue),并创建一个 ActivityThread 实例。

  2. Binder 注册ActivityThread 会通过 Binder 向 AMS 注册一个回调接口,从而能够接收 AMS 发送的指令。

  3. Application 创建AMS 通过 Binder 指令通知 ActivityThreadActivityThread 随后通过反射创建 Application 实例,并调用其 onCreate() 方法。

  4. Activity 创建AMS 再次发送指令,ActivityThread 接收到后:

    • 通过反射创建目标 Activity 的实例。
    • 执行 attach() 方法,将 ContextWindow 绑定到 Activity
    • 调用 ActivityonCreate()onStart()onResume() 等生命周期方法。
  5. UI 绘制ActivityonResume() 调用后,其 DecorView 被添加到 WindowManager,随后触发 UI 的测量、布局和绘制,最终通过 SurfaceFlinger 显示到屏幕上。


五、多进程协同流程图

用户点击图标  
  ↓  
[Launcher 进程] →(Binder IPC)→ [SystemServer 进程] (AMS)  
  ↓  
[Zygote 进程] ←(Socket)←(请求fork)← [SystemServer 进程][App 进程] →(Binder IPC)→ [SystemServer 进程] (注册)  
  ↓  
[App 进程] ←(Binder IPC)←(指令)← [SystemServer 进程] (执行onCreate等)