一、Activity Manager 概述:AMS在Android系统中的定位、核心职责、与WMS/PMS的关系

各位同学,今天我们正式开始《Android Activity Manager 深度解析》的第一章。说实话,我每次带新人入门Framework,都会从AMS讲起。为什么?因为ActivityManagerService是整个Android系统里最绕不开的一个服务。你点开一个App、切换一个页面、按一下Home键,背后全是AMS在调度。

嗯,咱们先别急着看代码。先搞清楚AMS到底是个什么角色,它在系统里站在哪个位置,跟其他几个大管家——WMS、PMS——是怎么分工合作的。这就像你进一家公司,得先知道谁是CEO、谁是CTO、谁是COO,对吧?

1.1 AMS在Android系统中的定位

Android系统从架构上分五层:Linux内核、HAL硬件抽象层、Native系统库、Java Framework层、应用层。AMS就住在Java Framework层,具体来说,它在system_server进程里。

system_server这个进程,我习惯叫它“系统大管家”。它里面跑着几十个系统服务,AMS是其中最核心的几个之一。你可以把AMS理解为Android系统的“进程与组件调度中心”。

它的定位,说白了就一句话:管理所有应用的生命周期和交互行为

举个例子,你打开微信,AMS要决定:微信的进程是否存在?如果不存在,就fork一个Zygote进程来启动它。如果存在,是把它从后台拉到前台,还是直接复用已有的Activity栈?这些决策,都是AMS做的。

核心要点:AMS是Android Framework中唯一一个同时管理“进程生命周期”和“组件调度”的服务。它既管生死(进程),又管行为(Activity、Service、Broadcast、ContentProvider)。

1.2 AMS的核心职责

我梳理了一下,AMS的职责可以归纳为以下五大块。每一块我在实际项目里都踩过坑,后面会慢慢展开讲。

职责领域 具体工作 我遇到的坑
Activity栈管理 维护ActivityRecord、TaskRecord、ActivityStack,处理启动、切换、销毁 曾经因为栈嵌套导致启动模式混乱,App界面卡死
进程管理 维护ProcessRecord,控制进程的创建、调度、杀死 低内存时AMS误杀前台进程,用户数据丢失
组件调度 管理Service、BroadcastReceiver、ContentProvider的注册与分发 广播超时导致ANR,排查了半天才发现是AMS队列阻塞
权限与Intent解析 解析Intent,匹配Activity/Service/Broadcast,检查权限 隐式Intent匹配规则写错,App之间无法跳转
系统状态监控 监听屏幕旋转、Home键、最近任务、锁屏等事件 锁屏后AMS未及时冻结后台,导致耗电异常

你看,这五大块几乎覆盖了用户能感知到的所有交互行为。所以我说,AMS是Android系统的“心脏”,一点不为过。

1.3 AMS与WMS、PMS的关系

很多初学者会把AMS、WMS(WindowManagerService)、PMS(PackageManagerService)搞混。其实它们三个分工非常明确,但又紧密协作。

我画了一张图,帮你理清它们之间的关系:

AMS、WMS、PMS 协作关系图 ActivityManagerService 进程管理 · 组件调度 · 栈管理 WindowManagerService 窗口管理 · 触摸事件 · 动画 PackageManagerService 包管理 · 权限 · 组件注册 通知窗口焦点变化 查询组件信息 上报触摸事件 返回Intent匹配结果 三者通过Binder跨进程通信,共同支撑Android的多任务与窗口系统 AMS是调度中心,WMS负责渲染,PMS提供组件元数据

从图上你能看到,AMS是“调度中心”,它不直接画界面,也不直接管理APK文件。它只负责“决策”——哪个Activity该显示、哪个进程该保留、哪个广播该发给谁。

具体来说:

  • AMS ↔ WMS:AMS决定“显示哪个Activity”,然后通知WMS“请把这个窗口画出来”。WMS负责窗口的层级、大小、动画、触摸事件分发。我记得有一次,App启动时黑屏了很久,排查下来是AMS通知WMS创建窗口时,WMS的窗口令牌校验没通过,导致窗口一直没显示出来。
  • AMS ↔ PMS:AMS启动Activity时,需要知道这个Activity在哪个APK里、有没有注册、需要什么权限。这些信息都来自PMS。PMS就像一本电话簿,AMS查它来找到正确的组件。我曾经遇到一个坑:App升级后,PMS缓存没刷新,AMS拿到的还是旧版本的组件信息,导致启动崩溃。
我的经验:调试AMS相关问题时,一定要同时关注WMS和PMS的状态。比如Activity启动慢,不一定是AMS的问题,可能是WMS的窗口创建卡住了,也可能是PMS的Intent解析耗时太长。三者是联动的,别只盯着一个看。

1.4 为什么AMS这么重要?

你想想看,用户每天打开几十个App,来回切换,按Home键、按返回键、接电话、看通知……所有这些操作,最终都会走到AMS里。AMS如果挂了,整个系统就重启了——没错,system_server进程崩溃会导致手机直接重启。

我在做系统稳定性优化时,统计过线上数据:大约30%的系统重启问题,根因都在AMS。要么是AMS内部死锁,要么是AMS处理消息超时导致ANR,进而触发Watchdog杀进程。

所以,理解AMS,不只是为了面试,更是为了你能真正解决线上问题。后面我们会一步步深入AMS的源码,从startActivity开始,把整个链路走一遍。

注意:AMS的代码量非常大,光一个ActivityManagerService.java就有两万多行。别试图一次性读完。我的建议是:先理解核心流程,再逐步深入细节。我们这门课会按“启动→切换→销毁→进程管理→异常处理”的顺序来拆解。

好,第一章就到这里。记住AMS的定位:它是Android系统的进程与组件调度中心。它的核心职责是管理Activity栈、进程、组件、权限和系统状态。它与WMS、PMS紧密协作,共同支撑起整个Android的多任务体验。

下一章,我们会从startActivity这个入口开始,一步步跟踪AMS的启动流程。到时候你会看到,一个简单的点击操作,背后有多少代码在跑。


公众号:蓝海资料掘金营,微信deep3321