ClientTransaction 如何驱动 Activity 生命周期
2026/8/6大约 3 分钟AMS 生命周期Android 14ClientTransactionLaunchActivityItemActivityThread
ClientTransaction 如何驱动 Activity 生命周期
目标进程 attach 后,system_server 不会跨进程直接调用 Activity.onCreate()。它把启动回调 和期望生命周期状态装入 ClientTransaction,通过 Binder 送到应用,再由应用主线程的 TransactionExecutor 按顺序执行。
system_server 下发事务,应用执行回调
| 常见误解 | 正确理解 |
|---|---|
| system_server 直接调用 Activity 的 onCreate | 它下发一个“事务包”,由应用主线程自己执行 |
| 每个生命周期都是一次独立 Binder 调用 | 多个生命周期项可以打包在一个 ClientTransaction 里按序执行 |
ClientTransaction 是“脚本包”:服务端把要执行的生命周期项写进包,应用主线程收到后按顺序执行。onCreate() 的调用者是 Instrumentation/ActivityThread,不是 system_server。
事务主链
逐步解释:
- ① 组装:
ActivityTaskSupervisor.launchActivity(...)构造LaunchActivityItem(ActivityTaskSupervisor.java:932)。 - ② 调度:
ClientLifecycleManager.scheduleTransaction()(ClientLifecycleManager.java:64)把事务发给应用。 - ③ 跨进程:经
IApplicationThread.scheduleTransaction(IApplicationThread.aidl:162)到达 ActivityThread。 - ④ 执行:
TransactionExecutor.execute()(TransactionExecutor.java:84)按顺序执行事务项。 - ⑤ 启动回调:
LaunchActivityItem.execute()(LaunchActivityItem.java:106)调用client.handleLaunchActivity(...)(114 行)。 - ⑥ 创建 Activity:
ActivityThread.handleLaunchActivity()(4143 行)→performLaunchActivity()(3827 行)→callActivityOnCreate()(3973 行)。
两个状态要分开
| 状态 | 位置 | 说明 |
|---|---|---|
| 服务端 State | ActivityRecord(system_server) | INITIALIZING → STARTED → RESUMED |
| 客户端回调 | Activity(应用进程) | onCreate → onStart → onResume |
服务端状态先推进,客户端事务随后执行;回调由应用主线程完成,两者通过事务结果间接同步。
源码证据
阅读目标:确认“编排在系统、执行在应用”。
正文指针:ActivityTaskSupervisor.java:932;TransactionExecutor.java:84;ActivityThread.java:4143 / 3973。
// ActivityTaskSupervisor.java:932
final LaunchActivityItem launchActivityItem = LaunchActivityItem.obtain(r.token, ...);// ActivityThread.java:3973
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);这段代码证明: 服务端只组装事务项,callActivityOnCreate() 在应用主线程执行,Activity 的创建权始终在应用进程。
与 WMS 的衔接
Activity 走到 onResume() 后,窗口链路仍需继续推进,具体见应用侧加窗。生命周期回调与窗口首帧是两条相邻但不同的链,排障时不能把“onResume 已执行”当成“画面已显示”。
源码入口
生命周期事务执行完毕不代表窗口已有画面,窗口侧总览见 WMS 是什么。
源码基准:android-14.0.0_r75。
以下文件默认位于 frameworks/base/,表中省略该前缀:
| 文件 | 关键位置 | 作用 |
|---|---|---|
services/core/java/com/android/server/wm/ActivityTaskSupervisor.java | ~900 行 launchActivity(...);932 行 LaunchActivityItem.obtain(...) | 启动事务组装 |
services/core/java/com/android/server/wm/ClientLifecycleManager.java | 64 行 scheduleTransaction(...) | 事务调度 |
core/java/android/app/servertransaction/ClientTransaction.java | 49 行 class ClientTransaction | 事务载体 |
core/java/android/app/servertransaction/TransactionExecutor.java | 84 行 execute(...) | 事务执行 |
core/java/android/app/servertransaction/LaunchActivityItem.java | 106 行 execute(...);114 行 client.handleLaunchActivity(...) | 启动项执行 |
core/java/android/app/ActivityThread.java | 4143 行 handleLaunchActivity(...);3827 行 performLaunchActivity(...);3973 行 callActivityOnCreate(...) | 应用侧创建 |
core/java/android/app/IApplicationThread.aidl | 162 行 scheduleTransaction(...) | Binder 回调接口 |