从 startActivity 到 ATMS 的客户端链路
从 startActivity 到 ATMS 的客户端链路
Activity.startActivity() 看起来是一次普通 Java 调用,真正的跨进程点却在 ActivityTaskManager.getService().startActivity(...)。在到达这行之前,Activity 与 Instrumentation 都运行在调用方应用进程内,负责补齐调用者、token、类型和 options。
跨进程发生在哪一行
| 常见误解 | 正确理解 |
|---|---|
startActivity() 直接调用 system_server | 中间经过 Instrumentation 与 ActivityTaskManager 客户端封装 |
| 每次启动都新建一个 Binder 连接 | ActivityTaskManager 持有进程级单例代理,复用同一 Binder |
应用侧把“启动一个 Activity”包装成一次带 Intent、调用者和选项的请求;跨进程发生在 ActivityTaskManager.getService().startActivity(...) 这一行。
客户端主链
逐步解释:
- ① Activity 入口:
startActivity(Intent)内部走startActivityForResult()(Activity.java:5797)。 - ② Instrumentation 组装:
execStartActivity()(Instrumentation.java:1956)检查 ActivityMonitor 并准备参数。 - ③ 客户端代理:
ActivityTaskManager.getService()(ActivityTaskManager.java:155)返回进程级 IActivityTaskManager 代理。 - ④ 跨进程:
startActivity(...)(Instrumentation.java:2001)经 Binder 到达 ATMS。 - ⑤ 服务端入口:ATMS 校验调用者后
obtainStarter(...)组装启动请求(ATMS.java:1222 / 1294-1297)。 - ⑥ 返回:结果码回传,
checkStartActivityResult()把失败转成应用侧异常。
四个对象一次分清
| 对象 | 是什么 | 在链路中的职责 |
|---|---|---|
Activity | 发起方组件 | 寄件人 |
Instrumentation | 应用进程内的启动执行器 | 代填单的快递站 |
ActivityTaskManager | App 侧客户端封装 | 快递公司电话 |
IActivityTaskManager | Binder 接口 | 电话线路 |
源码证据
阅读目标:确认跨进程发生在 Instrumentation 调 getService().startActivity()。
正文指针:Instrumentation.java:2001;ActivityTaskManager.java:155;ATMS.java:1222。
// Instrumentation.java:2001
int result = ActivityTaskManager.getService().startActivity(whoThread,
who.getOpPackageName(), who.getAttributionTag(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()), token,
target != null ? target.mEmbeddedID : null, requestCode, 0, null, options);这段代码证明: 应用侧通过 ActivityTaskManager.getService() 拿到 Binder 代理并发起 startActivity;第一次跨进程就在这里。
服务端入口
ATMS 的 startActivity()(ATMS.java:1222)先做调用者与用户校验,再进入 startActivityAsUser(),最后 getActivityStartController().obtainStarter(intent, "startActivityAsUser") 组装出一次启动请求(ATMS.java:1297)。这一行是客户端链路的终点,也是下一章启动决策的起点。
源码入口
源码基准:android-14.0.0_r75。
以下文件默认位于 frameworks/base/,表中省略该前缀:
| 文件 | 关键位置 | 作用 |
|---|---|---|
core/java/android/app/Activity.java | 6261 行 startActivity(Intent);5797 行 startActivityForResult(...);5840 行 mInstrumentation.execStartActivity(...) | 应用入口 |
core/java/android/app/Instrumentation.java | 1956 行 execStartActivity(...);2001 行 getService().startActivity(...) | 组装与跨进程 |
core/java/android/app/ActivityTaskManager.java | 155 行 getService() | Binder 代理 |
core/java/android/app/IActivityTaskManager.aidl | 96 行 startActivity(...) | Binder 接口契约 |
services/core/java/com/android/server/wm/ActivityTaskManagerService.java | 1222 行 startActivity(...);1294 行 startActivityAsUser(...);1297 行 obtainStarter(...) | 服务端入口 |