Android系统中AMS原理解析

核心定位与职责概述

AMS 是 Android 系统核心服务 (system_server 进程) 中最关键的服务之一,由 com.android.server.am.ActivityManagerService 实现。它的核心职责是管理 Android 应用的核心组件(尤其是 Activity)的生命周期、协调应用进程、管理任务栈(Task)和任务(Task)、处理应用启动、切换、关闭,以及系统级的内存管理和调度策略执行。

超深度分析维度

  1. 架构与核心机制

    • 系统服务基石: 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 和异步机制进行优化。
    • 核心数据结构:
      • 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) 和进程管理策略的核心依据。
  2. Activity 生命周期管理的深度解析

    • 启动流程 (startActivity):
      1. Client 发起: 应用调用 startActivity() -> Instrumentation.execStartActivity() -> 通过 Binder IPC 调用 ActivityTaskManagerService.getService().startActivity() (ATMS, 在较新版本中 AMS 的部分职责被拆分到 ATMS)。
      2. AMS/ATMS 权限与 Intent 解析: AMS/ATMS 检查调用者权限 (checkGrantUriPermissionLocked, checkStartActivityPermission),解析 Intent (隐式/显式),确定目标 Activity 及其所属应用。
      3. 进程决策:
        • 如果目标 Activity 所属应用进程已存在且允许在该进程运行,则复用。
        • 否则,触发进程创建 (startProcessLocked -> 通过 ZygoteProcess 建立 Socket 连接 -> Zygote fork 新进程 -> 新进程启动 ActivityThread.main() -> 初始化 Application 和主线程 Looper)。
      4. 创建 ActivityRecord & 管理 Task:
        • 根据 Intent Flags (FLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITY_CLEAR_TOP 等) 和 android:launchMode 决定如何将新 Activity 放入现有 Task 或创建新 Task。
        • 创建对应的 ActivityRecord 对象,并将其放入合适的 Task 栈顶。
      5. 调度生命周期:
        • 如果目标进程已存在且处于前台/可见状态,AMS/ATMS 通过 Binder IPC 调用目标进程的 IApplicationThread.scheduleLaunchActivity() (应用进程的 ApplicationThreadActivityThread 的内部类,实现了 IApplicationThread 接口)。
        • ApplicationThread.scheduleLaunchActivity() 通过 Handler (H) 将消息 LAUNCH_ACTIVITY 发送到应用主线程。
        • 应用主线程的 ActivityThread.H 处理消息,调用 handleLaunchActivity() -> performLaunchActivity() (创建 Activity 实例, 调用 attach(), onCreate()) -> handleResumeActivity() (调用 onStart(), onResume())。
      6. 窗口管理与焦点: AMS/ATMS 与 WindowManagerService 紧密协作。当 Activity 进入 Resumed 状态时,AMS/ATMS 通知 WMS 为该 Activity 准备窗口、分配 Surface 并最终使其获得焦点 (ActivityRecord.makeActiveIfNeeded -> WMS 操作)。
    • 状态转换 (Pause/Resume/Stop/Destroy):
      • 当用户按 Home、启动新 Activity、屏幕旋转、配置变更、内存不足等情况发生时,AMS 会根据严格的规则(可见性、焦点、是否完成等)决定哪些 Activity 应该进入 onPause, onStop, onDestroy
      • 同样通过 IApplicationThread.scheduleXXXActivity() 系列方法通知应用进程执行相应的生命周期回调。
      • 关键协调点: 启动新 Activity 时,必须先暂停当前正在 Resume 的 Activity (onPause),只有当前 Activity 成功暂停后,新 Activity 才能启动。这确保了状态转换的原子性和用户界面的连贯性。AMS 通过 ActivityStack.startPausingLocked() 和等待 activityPaused() 回调来实现。
    • 配置变更: 当设备配置(屏幕方向、语言、字体大小等)改变时,AMS 会销毁并重建前台 Activity (默认行为)。它管理重建过程,确保 Intent 和状态 (onSaveInstanceState) 正确传递。
  3. 进程管理:调度者与刽子手

    • 进程状态模型 (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
    • 进程回收策略:
      • 主动回收 (AMS): 当系统资源紧张或满足特定条件时,AMS 会主动调用 killProcesses() 杀死选中的后台/空进程。选择策略基于 LRU 列表和 adj
      • 被动回收 (lmkd): 内核空间的内存压力触发 lmkd,它查询 AMS 提供的每个进程的 oom_score_adj (由 adj 映射而来) 和内存信息,选择分数最高的进程杀死。AMS 通过 socketlmkd 通信。
    • 后台限制 (Android 8.0+): AMS 严格执行后台执行限制,包括后台 Service 限制、后台位置访问限制、隐式广播限制等。它跟踪应用的后台状态,并阻止违规的后台操作。
  4. 任务 (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)。
  5. 与其他核心服务的紧密协作

    • 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)。
  6. 高级功能与机制

    • 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 对话框,并可能杀死问题进程。
    • 权限检查: 在启动 Activity/Service、发送广播、绑定 Service、访问 ContentProvider 等关键操作前,AMS 会进行严格的权限检查 (checkComponentPermission, checkGrantUriPermissionLocked),确保调用者拥有必要的权限或 URI 授权。
    • PendingIntent: AMS 是 PendingIntent 的实际创建者和执行者 (PendingIntentRecord)。它存储了创建时指定的 Intent、发送者信息、目标信息。当 PendingIntent 被触发时,AMS 负责以原始发送者的身份和权限执行相应的操作 (如启动 Activity)。
    • 多用户支持: UserController 管理多用户环境下的 Activity、Service、进程等。AMS 需要确保不同用户的数据和应用隔离。
    • 应用退出原因跟踪: AMS 记录应用进程退出的原因 (正常退出、崩溃 ANR、被杀、低内存被杀等),并通过 ActivityManager.getHistoricalProcessExitReasons() 提供给开发者用于分析。
  7. 性能与优化挑战

    • 单线程瓶颈: 作为 system_server 主线程的核心服务,AMS 处理的 Binder 调用量巨大。任何耗时的同步操作都可能导致系统卡顿甚至 ANR。内部大量使用异步 Handler 消息、锁优化、批处理操作来缓解。
    • 锁竞争: AMS 内部有全局锁 (AMS lockATMS lock),保护其核心数据结构。频繁的锁竞争是系统性能的主要瓶颈之一。Google 持续进行锁拆分和细粒度锁优化。
    • 内存开销: 维护大量 ActivityRecord, ProcessRecord, Task 等对象需要内存。系统会积极回收不再需要的记录。
    • 启动优化: AMS 是应用冷启动路径上的关键环节。其决策速度(进程查找/创建、Task 管理、权限检查)直接影响启动时间。优化措施包括预加载常用组件信息、优化 IPC 路径、并行化部分操作等。
  8. 演进与架构变化 (Android 7.0+)

    • 引入 ActivityTaskManagerService: 从 Android 10 (Q) 开始,为了支持更复杂的窗口模式(自由窗体、桌面模式),Google 将 AMS 中原先负责 Activity 启动、生命周期、任务栈管理的核心逻辑拆分到了新的服务 ActivityTaskManagerService 中。AMS 则更专注于进程管理、内存调度、权限控制等“系统级”任务。这种拆分提高了模块化程度和可维护性。
    • Freeform Windows: 对任务栈和窗口管理提出了更高要求,ATMS 负责管理不同窗口模式下的任务容器 (ActivityTask)。
    • 后台限制持续加强: 每个大版本几乎都有限制后台行为的新策略,AMS 是实现这些限制的关键执行者。

总结:AMS 的本质

  • Android 应用的“生命线”: 没有 AMS,四大组件无法被创建、启动、管理其生命周期。
  • 系统资源的“调度中心”: 决定哪个进程活着、哪个进程死、谁在前台、谁在后台、谁占用多少 CPU/内存资源。
  • 用户体验的“守护者”: 管理任务栈、返回键逻辑、多窗口、转场动画,确保用户操作流畅连贯。
  • 系统安全的“守门人”: 严格执行权限检查,隔离不同应用。
  • 系统稳定性的“监控者”: 检测和响应 ANR,防止失控应用拖垮系统。
  • 高度复杂且不断演进的核心枢纽: 其设计与实现直接反映了 Android 系统架构的核心思想和面临的挑战(性能、资源、多任务、安全)。

理解 AMS 的内部运作机制,对于进行 Android 系统级开发、深度性能优化、疑难问题排查(ANR、卡顿、崩溃、后台限制)、ROM 定制以及构建需要紧密集成系统能力的高级应用都至关重要。它是窥探 Android 系统灵魂的一扇关键窗口。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值