通俗易懂讲解AMS:Android 系统的 “大管家”

477 阅读4分钟

一、AMS 是什么?—— 系统的核心调度中心

AMS 是 Android 系统中最核心的服务之一,全称 ActivityManagerService,但它的功能远不止管理 Activity!

  • 位置:运行在 systemserver 进程中(系统启动后第一个关键进程)。
  • 本质:基于 Binder 机制的服务(类似 “远程服务中心”,应用通过 Binder 跨进程调用它的功能)。
  • 定位:四大组件(Activity、Service、BroadcastReceiver、ContentProvider)的 “总调度员”,同时负责进程管理、应用崩溃处理、性能分析等。
为什么说它是 “大管家”?
  • 组件管理:启动 / 销毁 Activity、Service,分发广播,管理 ContentProvider 的生命周期。
  • 进程管理:监控所有应用进程,计算 “内存优先级分数(oom_score)”,配合 lmkd 进程在内存不足时杀进程。
  • 系统协调:协调系统启动流程,发送关键阶段信号(如 “系统启动完成”),通知其他服务开始工作。

二、AMS 的启动过程:从 “出生” 到 “上岗”

AMS 的启动是 Android 系统启动的关键环节,贯穿 SystemServer 的启动流程(SystemServer 是启动所有系统服务的 “总控类”)。

1. 背景:SystemServer 的启动阶段

SystemServer 启动时会按顺序启动不同类型的服务:

  • bootstrap 服务(最高优先级,AMS 属于此类)→ core 服务 → other 服务 → apex 服务

  • 为了协调服务依赖,SystemServer 会发送 “阶段值(phase)”,例如:

    • PHASE_ACTIVITY_MANAGER_READY:AMS 准备就绪,其他服务可以调用它了。
    • PHASE_BOOT_COMPLETED:系统完全启动,用户可以使用设备了。
2. AMS 启动的四个关键步骤
① 出生(创建实例)

在 SystemServer.startBootstrapServices() 中,AMS 被创建并初始化核心模块:

  • 初始化进程管理模块 mProcessList、性能分析模块 mAppProfiler、广播队列 mFgBroadcastQueue 等。
  • 这些模块就像 AMS 的 “左右手”,各自负责专项任务。
② 设置系统进程(成为 “合法居民”)

在 setSystemProcess() 方法中:

  • 注册到服务管理器:通过 ServiceManager.addService() 将 AMS 注册为全局可访问的 Binder 服务(键为 activity)。
  • 记录自身进程信息:创建 ProcessRecord 对象记录 systemserver 进程(包名设为 android),并设置其 oom_score 为 -900(最高优先级,几乎不会被杀死)。
  • 告知 lmkd 进程:通过 updateOomAdjLocked() 发送进程优先级信息,确保系统关键进程不被误杀。
③ 准备(系统就绪,启动关键组件)

在 SystemServer.startOtherServices() 尾声,AMS 收到 systemReady() 通知:

  • 通知模块就绪:告诉 ActivityTaskManager(ATMS)、进程管理模块等 “可以开工了”。
  • 发送阶段信号:发送 PHASE_ACTIVITY_MANAGER_READY,告知其他服务 “AMS 已准备好,快来调用我”。
  • 启动 Launcher:调用 mAtmInternal.startHomeOnAllDisplays() 启动桌面应用,这是用户能使用设备的前提。
④ 等待启动动画完成(系统完全启动)

当 Launcher 启动完成后,AMS 发送 PHASE_BOOT_COMPLETED 信号:

  • 标志 Android 系统完全启动,所有服务进入正式工作状态。

三、AMS 的 “小伙伴”:核心模块解析

AMS 不是 “单打独斗”,而是通过多个模块协作完成复杂任务:

1. Activity 管理模块
  • 实际执行者ActivityTaskManagerService(ATMS)(单独的 Binder 服务,被 AMS 管理)。
  • 作用:管理所有 Activity 的生命周期(启动、暂停、停止),用 ActivityRecord 记录每个 Activity 的状态。
2. Service 管理模块
  • 实际执行者ActiveServices 类(非 Binder 服务,属于 AMS 内部模块)。
  • 作用:管理 Service 的启动、绑定、销毁,用 ServiceRecord 记录每个 Service。
3. BroadcastReceiver 管理模块
  • 实际执行者BroadcastQueue 类(分前台广播队列、后台广播队列等)。
  • 作用:分发广播、管理接收器生命周期,用 BroadcastRecord 记录广播任务。
4. ContentProvider 管理模块
  • 实际执行者ContentProviderHelper 类。
  • 作用:管理 ContentProvider 的创建和访问,用 ContentProviderRecord 记录提供者。
5. 进程管理模块
  • 核心类ProcessList(记录进程信息)和 OomAdjuster(计算进程优先级)。

  • 工作逻辑

    • ProcessList 用 ProcessRecord 保存所有进程,向 Zygote 发送创建进程的请求。
    • OomAdjuster 计算每个进程的 oom_score(分数越高越容易被杀),例如前台 Activity 进程分数为 0,后台进程分数更高。
    • 配合 lmkd 进程,在内存不足时按分数杀进程,释放资源。
6. App 错误管理模块
  • 核心类AppErrors
  • 作用:处理应用崩溃(Crash)、ANR(无响应),收集堆栈信息并记录日志,便于问题分析。
7. App 性能分析模块
  • 核心类AppProfiler
  • 作用:统计应用的 CPU、内存使用情况,为性能优化提供数据支持。

四、总结:AMS 为什么重要?

  • 系统枢纽:连接应用层和系统层,几乎所有应用操作(启动 Activity、发送广播等)都要经过 AMS。

  • 资源调度核心:管理进程优先级、内存分配,确保系统流畅运行。

  • 名字的 “欺骗性” :虽然叫 “ActivityManager”,但实际是四大组件 + 进程 + 性能的 “全能管家”。

后续学习方向:可深入研究进程管理中的 OomAdjuster 算法、Activity 启动流程、ANR 监控机制等,这些都是 Android 性能优化的关键知识点。