AMS 与 ATMS 如何在 system_server 中诞生
2026/8/6大约 3 分钟AMS 生命周期Android 14SystemServerActivityManagerGlobalLockActivityTaskManagerService
AMS 与 ATMS 如何在 system_server 中诞生
AMS 和 ATMS 对外表现为两个 Binder 服务,但它们不是两个独立进程。二者都由 SystemServer 在 system_server 中创建;ATMS 先建立 Activity/Task 管理骨架,AMS 随后 持有并初始化它。
服务对象与服务进程不是一回事
| 常见误解 | 正确理解 |
|---|---|
| AMS 和 ATMS 是独立进程 | 两者都运行在 system_server 进程内,由 SystemServer 创建 |
| AMS 与 ATMS 各有一把互不相干的锁 | ATMS 创建 WindowManagerGlobalLock 与 WMS 共享;AMS 自身实现 ActivityManagerGlobalLock |
Binder 接口会隐藏宿主进程边界。AMS 与 ATMS 实际都是 system_server 内的对象,通过 ServiceManager 注册后才对其他进程可见。
启动主线
逐步解释:
- ① 创建 ATMS:SystemServer 先
startService(ActivityTaskManagerService.Lifecycle.class),ATMS 构造时创建WindowManagerGlobalLock(ATMS.java:394)。 - ② 创建 AMS:
ActivityManagerService.Lifecycle.startService(...)创建 AMS,构造函数持有 ATMS(AMS.java:2644)并调用mActivityTaskManager.initialize(...)(2645 行)。 - ③ 注册服务:
ServiceManager.addService(Context.ACTIVITY_SERVICE, this, ...)(AMS.java:2082),App 才能通过 Binder 找到 AMS。 - ④ 共享锁:WMS 构造时
mGlobalLock = atm.getGlobalLock(),与 ATMS 共用同一把WindowManagerGlobalLock(ATMS.java:992)。 - ⑤ 分工运行:AMS 自己实现
ActivityManagerGlobalLock(AMS.java:687),ATMS/WMS 使用共享锁实例。
两个锁,一条纪律
AMS 的 mGlobalLock 是它自己(ActivityManagerGlobalLock 只是标记接口);ATMS/WMS 的 mGlobalLock 是 WindowManagerGlobalLock 实例。两把锁不是同一个对象,但系统通过 LockGuard 固定获取顺序,避免相互持锁等待。
需要记住的结论:ATMS 是锁的“业主”,WMS 是租客,AMS 用自己的锁。加窗与启动决策都发生在 synchronized (mGlobalLock) 内,因此互相可见。
执行线程
| 上下文 | 运行位置 | 负责内容 |
|---|---|---|
| system_server 主线程 | SystemServer | 创建 ATMS/AMS、注册服务 |
mHandler(MainHandler) | AMS 专属线程 | 进程、服务消息 |
mProcStartHandler | AMS 进程启动线程 | 进程启动调度 |
| Binder 线程 | system_server 线程池 | startActivity()、attachApplication() 等服务入口 |
源码证据
阅读目标:确认创建顺序与注册位置。
正文指针:SystemServer.java:1196-1199;AMS.java:2644-2645 / 2082;ATMS.java:394 / 992。
// SystemServer.java:1196-1199
ActivityTaskManagerService atm = mSystemServiceManager.startService(
ActivityTaskManagerService.Lifecycle.class).getService();
mActivityManagerService = ActivityManagerService.Lifecycle.startService(
mSystemServiceManager, atm);// ActivityManagerService.java:2644
mActivityTaskManager = atm;
mActivityTaskManager.initialize(mIntentFirewall, mPendingIntentController,
DisplayThread.get().getLooper());这段代码证明: ATMS 先创建,AMS 构造时持有并初始化 ATMS;两者都在 system_server 进程中。
源码入口
源码基准:android-14.0.0_r75。
以下文件默认位于 frameworks/base/,表中省略该前缀:
| 文件 | 关键位置 | 作用 |
|---|---|---|
services/java/com/android/server/SystemServer.java | 1196-1199 行 startService(ATMS.Lifecycle) / AMS.Lifecycle.startService | 创建顺序 |
services/core/java/com/android/server/wm/ActivityTaskManagerService.java | 394 行 mGlobalLock = new WindowManagerGlobalLock();992 行 getGlobalLock() | 锁的创建与共享 |
services/core/java/com/android/server/am/ActivityManagerService.java | 2566 行构造;2568 行 installLock;2644-2645 行持有并初始化 ATMS;2082 行 addService(activity, ams) | AMS 创建与注册 |
services/core/java/com/android/server/am/ActivityManagerGlobalLock.java | 24 行 interface ActivityManagerGlobalLock | 全局锁标记 |
services/core/java/com/android/server/wm/WindowManagerGlobalLock.java | 20 行 class WindowManagerGlobalLock | WM 全局锁类型 |