目标进程不存在时,系统如何创建它
目标进程不存在时,系统如何创建它
ActivityRecord 已经建立而目标进程不存在时,ATMS 不能直接调用应用代码。AMS 会把进程创建 请求交给 Zygote;新进程完成运行时初始化后,再通过 Binder attachApplication() 回到 system_server,系统这时才能继续调度 Activity。
创建请求与 attach 使用两种通道
| 常见误解 | 正确理解 |
|---|---|
| system_server 直接调用应用代码 | 它只请求 Zygote fork,新进程自己初始化 |
| system_server → Zygote 也是 Binder | 这一段是本地 socket;新进程 attach 回 system_server 才是 Binder |
冷启动是两个完全不同通道:system_server → Zygote 走 socket,新进程 → system_server 走 Binder。不要把两段画成同一种调用。
进程创建主链
逐步解释:
- ① AMS 发起:
startProcessLocked()(AMS.java:3021)转交mProcessList.startProcessLocked()(3025 行)。 - ② ProcessList 下单:
ProcessList.startProcessLocked()(ProcessList.java:1786)最终调用Process.start(entryPoint, ...)(2497 行)。 - ③ socket 请求:
ZygoteProcess.start()(ZygoteProcess.java:338)打开 Zygote socket 并发送参数(416 行zygoteSendArgsAndGetResult)。 - ④ fork:Zygote 执行
forkAndSpecialize()(Zygote.java:365)产出子进程。 - ⑤ 客户端就绪:子进程进入
ActivityThread.main()(ActivityThread.java:8543),建立主线程 Looper。 - ⑥ attach:
thread.attach(false, startSeq)(8579 行)内部调用mgr.attachApplication(mAppThread, startSeq)(8280 行),经 Binder 回到 AMS。 - ⑦ 登记:
AMS.attachApplication()(AMS.java:4875)→attachApplicationLocked()(4560 行)→mAtmInternal.attachApplication(...)(4931 行)通知 ATMS。
两段通道要分清
| 阶段 | 通道 | 方向 | 关键符号 |
|---|---|---|---|
| 请求 fork | socket | system_server → Zygote | ZygoteProcess.zygoteSendArgsAndGetResult() |
| 进程就绪 | Binder | 新进程 → system_server | IActivityManager.attachApplication() |
源码证据
阅读目标:确认 socket 与 Binder 两段链路的关键行。
正文指针:ProcessList.java:2497;ZygoteProcess.java:338 / 416;ActivityThread.java:8280;AMS.java:4875。
// ProcessList.java:2497
startResult = Process.start(entryPoint, ...);// ActivityThread.java:8280
mgr.attachApplication(mAppThread, startSeq);这段代码证明: 进程创建请求从 ProcessList 出发经 Zygote 完成 fork;新进程通过 attachApplication() 主动回报系统,两端通道不同。
attach 之后
attachApplicationLocked() 把进程登记进 AMS 的状态表,再通知 ATMS;ATMS 的 attachApplication(ATMS.java:6652)调用 mRootWindowContainer.attachApplication(wpc)(6658 行),让等待中的 ActivityRecord 进入启动流程——这正是下一章客户端事务的触发条件。
源码入口
本文从 AMS 发起应用进程创建开始;Zygote 自身的启动与孵化模型见 Zygote 如何孵化 system_server。
源码基准:android-14.0.0_r75。
以下文件默认位于 frameworks/base/,表中省略该前缀:
| 文件 | 关键位置 | 作用 |
|---|---|---|
services/core/java/com/android/server/am/ActivityManagerService.java | 3021 / 3025 行 startProcessLocked(...);4875 行 attachApplication(...);4560 行 attachApplicationLocked(...);4931 行 mAtmInternal.attachApplication(...) | 进程创建与登记 |
services/core/java/com/android/server/am/ProcessList.java | 1786 行 startProcessLocked(...);2497 行 Process.start(...) | 进程启动请求 |
core/java/android/os/ZygoteProcess.java | 338 行 start(...);416 行 zygoteSendArgsAndGetResult(...) | Zygote socket |
core/java/com/android/internal/os/Zygote.java | 365 行 forkAndSpecialize(...) | fork 子进程 |
core/java/android/app/ActivityThread.java | 8543 行 main();8267 行 attach(...);8280 行 attachApplication(...) | 应用侧入口 |
services/core/java/com/android/server/wm/ActivityTaskManagerService.java | 6652 行 attachApplication(...);6658 行 mRootWindowContainer.attachApplication(...) | 任务系统接管 |