核心定位与职责概述
AMS 是 Android 系统核心服务 (system_server 进程) 中最关键的服务之一,由 com.android.server.am.ActivityManagerService 实现。它的核心职责是管理 Android 应用的核心组件(尤其是 Activity)的生命周期、协调应用进程、管理任务栈(Task)和任务(Task)、处理应用启动、切换、关闭,以及系统级的内存管理和调度策略执行。
超深度分析维度
-
架构与核心机制
- 系统服务基石: AMS 作为
system_server进程中的重量级服务,在系统启动早期 (SystemServer阶段) 被初始化并注册到ServiceManager。它持有Context.ACTIVITY_SERVICE标识。 - Binder 通信枢纽:
- Server 端: AMS 本身是一个 Binder 服务端,实现了
IActivityManager接口 (IActivityManager.aidl)。所有与应用组件生命周期相关的跨进程调用(如startActivity(),startService(),bindService(),broadcastIntent())最终都会通过 Binder IPC 路由到 AMS。 - Client 端代理: 应用进程通过
ActivityManager(或ActivityManagerNative的封装) 获取到IActivityManager的 Binder 代理对象 (IActivityManager.Stub.Proxy),通过它向 AMS 发起请求。 - 线程模型: AMS 运行在
system_server的主线程 (android.ui或类似名称) 上。这意味着所有 Binder 调用请求默认都在这个单一线程上串行处理。这对 AMS 的性能和避免 ANR 提出了极高要求,内部大量使用 Handler 和异步机制进行优化。
- Server 端: AMS 本身是一个 Binder 服务端,实现了
- 核心数据结构:
- ActivityStack / ActivityDisplay / ActivityTask: (不同版本实现类名和结构有变化,如
ActivityStackSupervisor,RootActivityContainer,ActivityDisplay,Task)。这些类构成了管理 Activity 显示的层次结构:ActivityDisplay: 代表一个物理显示设备(如主屏、副屏)。ActivityTask: (Android 10+) 代表一个“任务容器”,通常对应一个窗口模式(全屏、分屏、画中画、自由窗口)。包含一个或多个Task。Task: 代表一个用户任务(一组相关的 Activity)。具有后进先出 (LIFO) 的栈结构 (ActivityRecord列表)。Task 是用户进行“返回”操作的基本单位。ActivityRecord: AMS 内部代表一个 Activity 实例的对象。存储了该 Activity 的所有关键信息(Intent, ComponentName, 状态, 所属进程, 所属 Task, 窗口 Token 等)。
- ProcessRecord: 代表一个应用进程。包含该进程的详细信息(进程名, uid, pid, 当前运行的组件列表, 重要性状态
adj, 内存状态,IApplicationThread代理等)。 - BroadcastRecord / BroadcastQueue: 管理广播的发送、接收和有序广播的队列。
- ServiceRecord / ActiveServices: 管理 Service 的生命周期和绑定状态。
- ContentProviderRecord: 管理 ContentProvider 的连接和引用计数。
- ProviderMap: 跟踪已安装的 ContentProvider。
- PendingIntentRecord: 管理 PendingIntent。
- UserController: 管理多用户。
- LRU 进程列表: 按重要性 (
adj) 和最近使用时间排序的进程列表,是内存回收 (lowmemorykiller) 和进程管理策略的核心依据。
- ActivityStack / ActivityDisplay / ActivityTask: (不同版本实现类名和结构有变化,如
- 系统服务基石: AMS 作为
-
Activity 生命周期管理的深度解析
- 启动流程 (startActivity):
- Client 发起: 应用调用
startActivity()->Instrumentation.execStartActivity()-> 通过 Binder IPC 调用ActivityTaskManagerService.getService().startActivity()(ATMS, 在较新版本中 AMS 的部分职责被拆分到 ATMS)。 - AMS/ATMS 权限与 Intent 解析: AMS/ATMS 检查调用者权限 (
checkGrantUriPermissionLocked,checkStartActivityPermission),解析 Intent (隐式/显式),确定目标 Activity 及其所属应用。 - 进程决策:
- 如果目标 Activity 所属应用进程已存在且允许在该进程运行,则复用。
- 否则,触发进程创建 (
startProcessLocked-> 通过ZygoteProcess建立 Socket 连接 ->Zygotefork 新进程 -> 新进程启动ActivityThread.main()-> 初始化Application和主线程 Looper)。
- 创建 ActivityRecord & 管理 Task:
- 根据 Intent Flags (
FLAG_ACTIVITY_NEW_TASK,FLAG_ACTIVITY_CLEAR_TOP等) 和android:launchMode决定如何将新 Activity 放入现有 Task 或创建新 Task。 - 创建对应的
ActivityRecord对象,并将其放入合适的Task栈顶。
- 根据 Intent Flags (
- 调度生命周期:
- 如果目标进程已存在且处于前台/可见状态,AMS/ATMS 通过 Binder IPC 调用目标进程的
IApplicationThread.scheduleLaunchActivity()(应用进程的ApplicationThread是ActivityThread的内部类,实现了IApplicationThread接口)。 ApplicationThread.scheduleLaunchActivity()通过 Handler (H) 将消息LAUNCH_ACTIVITY发送到应用主线程。- 应用主线程的
ActivityThread.H处理消息,调用handleLaunchActivity()->performLaunchActivity()(创建 Activity 实例, 调用attach(),onCreate()) ->handleResumeActivity()(调用onStart(),onResume())。
- 如果目标进程已存在且处于前台/可见状态,AMS/ATMS 通过 Binder IPC 调用目标进程的
- 窗口管理与焦点: AMS/ATMS 与
WindowManagerService紧密协作。当 Activity 进入Resumed状态时,AMS/ATMS 通知 WMS 为该 Activity 准备窗口、分配 Surface 并最终使其获得焦点 (ActivityRecord.makeActiveIfNeeded-> WMS 操作)。
- Client 发起: 应用调用
- 状态转换 (Pause/Resume/Stop/Destroy):
- 当用户按 Home、启动新 Activity、屏幕旋转、配置变更、内存不足等情况发生时,AMS 会根据严格的规则(可见性、焦点、是否完成等)决定哪些 Activity 应该进入
onPause,onStop,onDestroy。 - 同样通过
IApplicationThread.scheduleXXXActivity()系列方法通知应用进程执行相应的生命周期回调。 - 关键协调点: 启动新 Activity 时,必须先暂停当前正在 Resume 的 Activity (
onPause),只有当前 Activity 成功暂停后,新 Activity 才能启动。这确保了状态转换的原子性和用户界面的连贯性。AMS 通过ActivityStack.startPausingLocked()和等待activityPaused()回调来实现。
- 当用户按 Home、启动新 Activity、屏幕旋转、配置变更、内存不足等情况发生时,AMS 会根据严格的规则(可见性、焦点、是否完成等)决定哪些 Activity 应该进入
- 配置变更: 当设备配置(屏幕方向、语言、字体大小等)改变时,AMS 会销毁并重建前台 Activity (默认行为)。它管理重建过程,确保 Intent 和状态 (
onSaveInstanceState) 正确传递。
- 启动流程 (startActivity):
-
进程管理:调度者与刽子手
- 进程状态模型 (ProcessState / OOM_ADJ): AMS 维护每个进程的
ProcessRecord,其中最重要的属性之一是curAdj(当前 OOM_ADJ 值)。这是一个由 AMS 根据进程内运行的组件类型、可见性、用户交互状态动态计算出的整数,范围通常为 -1000 (空进程) 到 1000 (系统进程)。lmkd根据这个值决定在内存不足时杀死哪些进程。AMS 内部有复杂的逻辑 (updateOomAdjLocked) 来更新所有进程的 adj。 - 进程分类与优先级 (AMS 视角):
- 前台 (Foreground): 拥有正在交互的 Activity (
RESUMED) 或前台 Service。adj <= 0(最高优先级)。 - 可见 (Visible): 拥有可见但非焦点的 Activity (如对话框后面的 Activity 或分屏另一半)。
adj <= 100。 - 服务 (Service): 运行
startService()启动的 Service。adj <= 500。 - 后台 (Background): 没有前台/可见组件,但有 Activity 在后台 (
onStop后) 或缓存进程。adj > 700。 - 空 (Empty): 没有任何活动组件的进程,纯粹为了下次启动更快而保留。
adj = 900+(最容易被杀)。 - 持久 (Persistent): 系统核心进程,永不回收。
adj < 0。
- 前台 (Foreground): 拥有正在交互的 Activity (
- 进程回收策略:
- 主动回收 (AMS): 当系统资源紧张或满足特定条件时,AMS 会主动调用
killProcesses()杀死选中的后台/空进程。选择策略基于 LRU 列表和adj。 - 被动回收 (lmkd): 内核空间的内存压力触发
lmkd,它查询 AMS 提供的每个进程的oom_score_adj(由adj映射而来) 和内存信息,选择分数最高的进程杀死。AMS 通过socket与lmkd通信。
- 主动回收 (AMS): 当系统资源紧张或满足特定条件时,AMS 会主动调用
- 后台限制 (Android 8.0+): AMS 严格执行后台执行限制,包括后台 Service 限制、后台位置访问限制、隐式广播限制等。它跟踪应用的后台状态,并阻止违规的后台操作。
- 进程状态模型 (ProcessState / OOM_ADJ): AMS 维护每个进程的
-
任务 (Task) 与返回栈 (Back Stack)
- 任务概念: Task 是用户为了完成某项工作而与之交互的一系列 Activity 的集合。它独立于进程 - 一个 Task 中的 Activity 可以来自不同应用的不同进程。
- 任务栈管理: AMS (ATMS) 维护着全局的任务栈结构 (
ActivityStack,Task)。Task对象内部维护一个ActivityRecord的列表 (栈)。 - 启动模式 (
launchMode) 与 Intent Flags: 这些标志直接影响 AMS 如何将新 Activity 放入任务栈:standard/singleTop:通常进入调用者所在 Task。singleTask/singleInstance:可能创建新 Task 或复用已有的特定 Task。FLAG_ACTIVITY_NEW_TASK:强制创建新 Task (除非已有该 Activity 的 Task)。FLAG_ACTIVITY_CLEAR_TOP:如果目标 Activity 已在栈中,则清除它之上的所有 Activity。
- Recent Tasks: AMS 维护最近使用的任务列表 (
RecentTasks),提供给系统 UI (Recents 屏幕) 显示。这不仅仅是当前运行的 Task,还包括最近被销毁或放入后台的 Task 的快照 (TaskRecord)。
-
与其他核心服务的紧密协作
- WindowManagerService: 密不可分。
- AMS 负责 Activity 的生命周期状态和任务栈逻辑。
- WMS 负责窗口的布局、绘制、合成、输入事件分发、动画。
- 协作点: Activity 切换时的窗口添加/移除/排序、转场动画协调、焦点切换 (
ActivityRecord<->WindowToken)、分屏/多窗口模式管理、Keyguard (锁屏) 状态同步。
- PackageManagerService: AMS 依赖 PKMS 获取应用的安装信息、组件声明 (
AndroidManifest.xml解析结果)、权限信息、Intent 解析 (resolveIntent())。应用安装/卸载/更新时,PKMS 会通知 AMS 进行清理或状态更新。 - 电源管理 (PowerManagerService): AMS 在 Activity 进入/退出前台、屏幕亮灭时通知 PMS,影响设备的唤醒锁和休眠策略。PMS 在设备休眠前会询问 AMS 是否有正在进行的操作需要阻止休眠。
- 输入系统 (InputManagerService): AMS 负责将输入事件 (按键、触摸) 分发给当前获得焦点的窗口 (由 WMS 告知当前焦点窗口)。AMS 也参与 ANR 检测 (Input Dispatch Timeout)。
- WindowManagerService: 密不可分。
-
高级功能与机制
- ANR 监控:
- Service Timeout: 前台 Service 的
onStartCommand()或onBind()超过 20 秒未完成。 - Broadcast Timeout: 前台广播的
onReceive()超过 10 秒,后台广播超过 60 秒 (Android 8.0+ 对后台广播有严格限制)。 - Input Dispatch Timeout: 应用主线程 5 秒内未响应输入事件。
- AMS 内部设置定时器 (
ActiveServices.serviceTimeout(),BroadcastQueue.processNextBroadcast(),InputManagerService通知)。超时后,AMS 收集进程状态和堆栈信息 (dumpStackTraces()),弹出 ANR 对话框,并可能杀死问题进程。
- Service Timeout: 前台 Service 的
- 权限检查: 在启动 Activity/Service、发送广播、绑定 Service、访问 ContentProvider 等关键操作前,AMS 会进行严格的权限检查 (
checkComponentPermission,checkGrantUriPermissionLocked),确保调用者拥有必要的权限或 URI 授权。 - PendingIntent: AMS 是
PendingIntent的实际创建者和执行者 (PendingIntentRecord)。它存储了创建时指定的 Intent、发送者信息、目标信息。当PendingIntent被触发时,AMS 负责以原始发送者的身份和权限执行相应的操作 (如启动 Activity)。 - 多用户支持:
UserController管理多用户环境下的 Activity、Service、进程等。AMS 需要确保不同用户的数据和应用隔离。 - 应用退出原因跟踪: AMS 记录应用进程退出的原因 (正常退出、崩溃 ANR、被杀、低内存被杀等),并通过
ActivityManager.getHistoricalProcessExitReasons()提供给开发者用于分析。
- ANR 监控:
-
性能与优化挑战
- 单线程瓶颈: 作为
system_server主线程的核心服务,AMS 处理的 Binder 调用量巨大。任何耗时的同步操作都可能导致系统卡顿甚至 ANR。内部大量使用异步 Handler 消息、锁优化、批处理操作来缓解。 - 锁竞争: AMS 内部有全局锁 (
AMS lock或ATMS lock),保护其核心数据结构。频繁的锁竞争是系统性能的主要瓶颈之一。Google 持续进行锁拆分和细粒度锁优化。 - 内存开销: 维护大量
ActivityRecord,ProcessRecord,Task等对象需要内存。系统会积极回收不再需要的记录。 - 启动优化: AMS 是应用冷启动路径上的关键环节。其决策速度(进程查找/创建、Task 管理、权限检查)直接影响启动时间。优化措施包括预加载常用组件信息、优化 IPC 路径、并行化部分操作等。
- 单线程瓶颈: 作为
-
演进与架构变化 (Android 7.0+)
- 引入 ActivityTaskManagerService: 从 Android 10 (Q) 开始,为了支持更复杂的窗口模式(自由窗体、桌面模式),Google 将 AMS 中原先负责 Activity 启动、生命周期、任务栈管理的核心逻辑拆分到了新的服务
ActivityTaskManagerService中。AMS 则更专注于进程管理、内存调度、权限控制等“系统级”任务。这种拆分提高了模块化程度和可维护性。 - Freeform Windows: 对任务栈和窗口管理提出了更高要求,ATMS 负责管理不同窗口模式下的任务容器 (
ActivityTask)。 - 后台限制持续加强: 每个大版本几乎都有限制后台行为的新策略,AMS 是实现这些限制的关键执行者。
- 引入 ActivityTaskManagerService: 从 Android 10 (Q) 开始,为了支持更复杂的窗口模式(自由窗体、桌面模式),Google 将 AMS 中原先负责 Activity 启动、生命周期、任务栈管理的核心逻辑拆分到了新的服务
总结:AMS 的本质
- Android 应用的“生命线”: 没有 AMS,四大组件无法被创建、启动、管理其生命周期。
- 系统资源的“调度中心”: 决定哪个进程活着、哪个进程死、谁在前台、谁在后台、谁占用多少 CPU/内存资源。
- 用户体验的“守护者”: 管理任务栈、返回键逻辑、多窗口、转场动画,确保用户操作流畅连贯。
- 系统安全的“守门人”: 严格执行权限检查,隔离不同应用。
- 系统稳定性的“监控者”: 检测和响应 ANR,防止失控应用拖垮系统。
- 高度复杂且不断演进的核心枢纽: 其设计与实现直接反映了 Android 系统架构的核心思想和面临的挑战(性能、资源、多任务、安全)。
理解 AMS 的内部运作机制,对于进行 Android 系统级开发、深度性能优化、疑难问题排查(ANR、卡顿、崩溃、后台限制)、ROM 定制以及构建需要紧密集成系统能力的高级应用都至关重要。它是窥探 Android 系统灵魂的一扇关键窗口。
2349

被折叠的 条评论
为什么被折叠?



