Android随笔-ATMS与AMS区别与联系

ATMS(ActivityTaskManagerService)和 AMS(ActivityManagerService)是 Android 系统中最核心的两个系统服务,它们的关系可以理解为"拆分与协作"------Android 10 将 AMS 中过于臃肿的 Activity 管理职责剥离出来,成立了专门的 ATMS。

一、核心区别

维度 AMS (ActivityManagerService) ATMS (ActivityTaskManagerService)
引入版本 Android 1.0 起一直存在 Android 10 (API 29) 引入
源码路径 frameworks/base/services/core/java/com/android/server/am/ frameworks/base/services/core/java/com/android/server/wm/
核心职责 进程管理、内存管理、Service/Broadcast/ContentProvider 管理 Activity 生命周期、任务栈、启动模式、窗口容器管理
管理对象 ProcessRecord、ServiceRecord、BroadcastRecord ActivityRecord、TaskRecord、ActivityStack
代码规模 Android 10 前约 1.9 万行,拆分后瘦身 新拆分出的服务,专注 Activity 相关
对外接口 IActivityManager (AIDL) IActivityTaskManager (AIDL)

二、为什么拆分?

Android 1.0 ~ 4.4: AMS 一统天下,管理所有四大组件

Android 5.0 ~ 9.0: WMS 独立,但 AMS 仍管理 Activity + 窗口协调

Android 10+: 彻底拆分

├─ ATMS: Activity + Task + Stack + Display 管理

├─ AMS: 进程 + 内存 + Service/Broadcast/Provider

└─ WMS: 窗口管理(与 ATMS 协同,目标最终融合)

Android 12+: 引入 TaskFragment,进一步细化任务管理

  • 代码臃肿:AMS 代码量过大(近 2 万行),耦合度高,维护困难。
  • 职责混乱:Activity 管理与窗口管理分散在 AMS 和 WMS 中,协作复杂、代码冗余。
  • 未来融合:Google 的长期目标是将 Activity 和 Window 完全融合管理,ATMS 放在 server/wm 目录下正是这一意图的体现

三、紧密联系(协作关系)

虽然职责分离,但 ATMS 和 AMS 并非独立运行,而是紧密协作:

1. 启动顺序:ATMS 先于 AMS

在 SystemServer.startBootstrapServices() 中:

java 复制代码
// 1. 先启动 ATMS
ActivityTaskManagerService atm = mSystemServiceManager.startService(
    ActivityTaskManagerService.Lifecycle.class).getService();

// 2. 再启动 AMS,并将 ATMS 作为参数传入
mActivityManagerService = ActivityManagerService.Lifecycle.startService(
    mSystemServiceManager, atm);

ATMS 先创建并注册到 ServiceManager,AMS 构造时持有 ATMS 引用。

2. AMS 持有 ATMS 引用

java 复制代码
// ActivityManagerService.java
public class ActivityManagerService extends IActivityManager.Stub {
    @VisibleForTesting
    public ActivityTaskManagerInternal mAtmInternal;  // ATMS 的本地接口

    public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) {
        ...
        mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class);
    }

    // AMS 需要恢复 Activity 时,委托给 ATMS
    public void systemReady(...) {
        mAtmInternal.resumeTopActivities(false);
    }
}

ActivityTaskManagerInternal 是抽象类,唯一实现ActivityTaskManagerService.LocalService。

3. 进程创建时的协作

当启动 Activity 发现目标进程不存在时:

ATMS.ActivityStackSupervisor.startSpecificActivityLocked()

→ 进程不存在 → 通知 AMS 创建进程

→ AMS.startProcessLocked() → 通过 Socket 通知 Zygote fork 新进程

→ 新进程启动后 attachApplication() → 回到 ATMS 继续启动 Activity

ATMS 负责 Activity 的调度决策 ,AMS 负责进程的生死管理。

4. 初始化时的协作

AMS 初始化时,ATMS 的初始化被调用:

java 复制代码
// AMS 的初始化流程中
public void initPowerManagement() {
    ...
    // ATMS 初始化 Activity 相关
    mAtmInternal.initialize(...);
}

四、代码层面的关联

关联点 说明
AMS.mAtmInternal AMS 通过本地服务获取 ATMS 的 LocalService 实例
ATMS.mAmInternal ATMS 反向持有 AMS 的 ActivityManagerInternal
ActivityStackSupervisor 原 AMS 中的类,现归属 ATMS,管理 Activity 栈
WindowProcessController ATMS 中管理进程状态,与 AMS 的 ProcessRecord 对应

五、总结

ATMS 是 AMS 的"Activity 专属分身" 。

设计意图:解耦、瘦身、为将来 Activity 与 Window 的完全融合铺路。

  • 区别:AMS 管"进程和三大组件",ATMS 管"Activity 和任务栈"。
  • 联系:两者同处 SystemServer 进程,ATMS 先于 AMS 启动,AMS 持有 ATMS 引用;Activity 启动需要进程时,ATMS 委托 AMS 创建进程。
相关推荐
小乖写代码6 分钟前
字段获取代码(Android) · Android Input Examples
android·whatsapp·账号注册
booboosui16 分钟前
停一个活只有杀进程:界面上少了「说点要求」
android
传奇开心果编程3 小时前
【Flutter踩坑排雷】第28课:平台目录缺失与修复坑|`flutter create` 的“重建”与“覆盖”边界
android·flutter·ios·移动开发·跨平台·dart·声明式ui
longxibo12 小时前
【AIBIZ低代码平台:能长出业务系统的平台】
android·低代码·rxjava
AI_Gump20 小时前
Harness篇|DeepSeek Harness 上手机:五条安卓移植路线与 App 内 Linux 拆解
android·linux·人工智能·智能手机·deepseek
疯华整猫1 天前
否决 Flutter 提案那天,我发现自己也说不清 Framework 管什么
android
传奇开心果编程2 天前
【Flutter踩坑排雷】第25课:ScrollController 误用坑|跳转失效、监听泄漏与“控制器未附加”
android·flutter·ios·移动开发·跨平台·dart·声明式ui
慕容雪_2 天前
Capacitor8-Android打包完整手册
android·打包·capacitor
阿杰m2 天前
Android源码第十三章:Bluetooth——沿一次发现走到控制器
android
booboosui2 天前
派活给另一个 AI:前后两次文件夹快照,就是交付清单
android