Android AMS(Activity Manager Service)详解
一、AMS 是什么
AMS(Activity Manager Service)是 Android 系统中最核心的服务之一,负责管理四大组件(Activity、Service、BroadcastReceiver、ContentProvider)的生命周期和调度,以及进程管理、任务栈管理、权限检查等。
它运行在system_server进程中,是 Framework 层的核心服务。
二、AMS 的核心职责
| 职责 | 说明 |
|---|---|
| Activity 管理 | 启动、暂停、恢复、销毁 Activity;管理任务栈和返回栈 |
| Service 管理 | 启动、绑定、解绑、停止 Service |
| Broadcast 管理 | 发送、接收有序/无序广播 |
| 进程管理 | 启动新进程、回收低优先级进程(LRU 列表) |
| 任务栈管理 | 管理 Task 和 Activity 的启动模式 |
| 权限检查 | 验证调用者是否有权限执行操作 |
| ANR 检测 | 监控主线程响应超时 |
三、AMS 的架构位置
┌─────────────────────────────────────┐ │ 应用层 (App) │ ├─────────────────────────────────────┤ │ ActivityManager (Java API) │ ├─────────────────────────────────────┤ │ ActivityManagerNative (AIDL) │ ├─────────────────────────────────────┤ │ ActivityManagerService (system_server) │ │ ├─ ActivityStackSupervisor │ │ ├─ ActivityStack │ │ ├─ ProcessRecord │ │ └─ ... │ ├─────────────────────────────────────┤ │ Zygote 进程孵化 │ ├─────────────────────────────────────┤ │ Linux Kernel │ └─────────────────────────────────────┘四、核心类与数据结构
1. ActivityManagerService
AMS 的主类,继承自IActivityManager.Stub,通过 Binder 暴露服务接口。
2. ActivityStackSupervisor
管理所有 Activity 栈的调度器,Android 4.4 引入,用于支持多窗口和多用户。
3. ActivityStack
管理一个任务栈,维护ActivityRecord列表。
4. ActivityRecord
代表一个 Activity 实例,包含:
info:ActivityInfo(manifest 信息)task:所属的 TaskRecordstate:当前状态(INITIALIZING、RESUMED、PAUSED 等)app:绑定的 ProcessRecord
5. TaskRecord
代表一个任务(Task),包含多个 ActivityRecord。
6. ProcessRecord
代表一个运行中的进程,包含:
pid:进程 IDuid:用户 IDthread:应用主线程的 IApplicationThread Binder 代理activities:该进程中运行的 Activity 列表
五、Activity 启动流程(重点)
以startActivity()为例,完整流程如下:
App (调用方) ↓ Binder IPC ActivityManagerService.startActivity() ↓ ActivityStarter.execute() ← Android 7.0+ 将启动逻辑抽离到 ActivityStarter ↓ ActivityStackSupervisor.startSpecificActivityLocked() ↓ 判断目标进程是否存在? ├── 否 → startProcessLocked() → 通过 Zygote fork 新进程 │ → 创建 ApplicationThread → attachApplication() │ └── 是 → 直接使用已有进程 ↓ ActivityStack.startActivityLocked() ↓ ActivityStack.resumeTopActivityInnerLocked() ↓ ActivityStackSupervisor.realStartActivityLocked() ↓ Binder IPC (跨进程调用) ApplicationThread.scheduleLaunchActivity() ← 进入目标 App 进程 ↓ ActivityThread.handleLaunchActivity() ↓ Instrumentation.newActivity() ← 反射创建 Activity 实例 ↓ Activity.attach() ← 创建 PhoneWindow、WindowManager ↓ Activity.onCreate() Activity.onStart() Activity.onResume() ↓ WindowManager.addView() ← 将 DecorView 添加到窗口六、进程优先级与 LRU 管理
AMS 使用oom_adj值管理进程优先级,值越大越容易被杀死:
| 优先级 | oom_adj | 说明 |
|---|---|---|
| FOREGROUND_APP | 0 | 前台 Activity |
| VISIBLE_APP | 1 | 可见但不可交互 |
| PERCEPTIBLE_APP | 2 | 可感知(前台 Service、音乐播放等) |
| BACKUP_APP | 3 | 备份进程 |
| HEAVY_WEIGHT_APP | 4 | 重量级后台 |
| SERVICE | 5 | 后台 Service |
| HOME_APP | 6 | Home 进程 |
| PREVIOUS_APP | 7 | 上一个前台应用 |
| SERVICE_B | 8 | 长时间运行的 Service |
| CACHED_APP | 9+ | 缓存进程(空进程) |
AMS 维护LRU(Least Recently Used)列表,当内存不足时,按优先级从低到高回收进程。
七、启动模式(LaunchMode)
AMS 通过launchMode和Intent Flag控制 Activity 的启动行为:
| 模式 | 说明 |
|---|---|
| standard | 每次启动都创建新实例 |
| singleTop | 栈顶复用,否则新建 |
| singleTask | 栈内复用,清空其上所有 Activity |
| singleInstance | 独占一个任务栈 |
AMS 内部通过ActivityStarter.computeLaunchingTaskFlags()计算最终启动标志。
八、ANR 检测机制
AMS 在以下场景检测 ANR:
Service ANR:
ServiceTimeout(前台 20s,后台 200s)Broadcast ANR:
BroadcastTimeout(前台 10s,后台 60s)Input ANR:输入事件 5s 未处理
ContentProvider ANR:发布超时 10s
实现原理:AMS 通过Handler发送延迟消息,若超时前未收到完成回调,则触发 ANR。
九、AMS 初始化流程
system_server启动时初始化 AMS:
java
// SystemServer.java private void startBootstrapServices() { // 1. 创建 AMS 实例 mActivityManagerService = mSystemServiceManager.startService( ActivityManagerService.Lifecycle.class).getService(); // 2. 设置系统进程 mActivityManagerService.setSystemProcess(); } private void startOtherServices() { // 3. 安装系统 ContentProvider mActivityManagerService.installSystemProviders(); // 4. 系统就绪 mActivityManagerService.systemReady(() -> { // 启动 Home Activity }); }十、关键源码路径
| 文件 | 说明 |
|---|---|
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java | AMS 主类 |
frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java | 栈管理器 |
frameworks/base/services/core/java/com/android/server/am/ActivityStack.java | 任务栈 |
frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java | 启动逻辑 |
frameworks/base/services/core/java/com/android/server/am/ProcessRecord.java | 进程记录 |
frameworks/base/services/core/java/com/android/server/am/ActivityRecord.java | Activity 记录 |
frameworks/base/core/java/android/app/ActivityThread.java | 应用主线程 |
frameworks/base/core/java/android/app/Instrumentation.java | 生命周期回调 |
十一、AMS 与相关服务的关系
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ AMS │◄───►│ WMS │ │ PMS │ │ (组件调度) │ │ (窗口管理) │ │ (包管理) │ └──────┬──────┘ └─────────────┘ └─────────────┘ │ ▼ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ Zygote │ │ BMS │ │ PKMS │ │ (进程孵化) │ │ (电池管理) │ │ (权限管理) │ └─────────────┘ └─────────────┘ └─────────────┘