ActivityManagerService(AMS)是 Android 框架层最核心的系统服务,是整个 Android 组件管理、进程调度和应用生命周期的大总管。本文基于 Android 10 (API 29) / Android 11 (API 30) 的 AOSP 源码,深入分析 AMS 的体系结构、启动流程、核心数据结构和关键运行机制。
一、AMS 的体系定位 1.1 AMS 在系统架构中的位置 AMS 运行在 system_server 进程中,以 Java 对象的形态存在,但它同时通过 Binder 向外界暴露 IActivityManager 接口。所有第三方应用进程通过 ActivityManager(封装了 Binder 代理)与 AMS 通信。
┌─────────────────────────────────────────────────────────┐ │ App Process │ │ ┌──────────┐ ┌──────────────┐ ┌──────────────────┐ │ │ │ Activity │ │ActivityThread│ │ ActivityManager │ │ │ │ │→ │ │→ │ (Binder Proxy) │ │ │ └──────────┘ └──────────────┘ └────────┬─────────┘ │ │ │ Binder IPC │ └───────────────────────────────────────────┼─────────────┘ │ ┌───────────────────────────────────────────┼─────────────┐ │ system_server │ │ │ ┌────────────────────────────────────────▼──────────┐ │ │ │ ActivityManagerService │ │ │ │ ┌─────────────┐ ┌──────────────┐ ┌─────────┐ │ │ │ │ │ActivityStarter│ │ATMS(Android10+)│ │ OomAdj │ │ │ │ │ └─────────────┘ └──────────────┘ └─────────┘ │ │ │ └───────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────┘
AOSP 源码路径:
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
frameworks/base/services/core/java/com/android/server/am/ActivityTaskManagerService.java
frameworks/base/core/java/android/app/ActivityManager.java
1.2 AMS 的 Binder 继承链 AMS 的类继承关系体现了其作为 Binder 服务端的设计:
public class ActivityManagerService extends IActivityManager .Stub implements Watchdog .Monitor, BatteryStatsImpl.BatteryCallback {
这个继承链确保了 AMS 可以跨进程接收来自各应用进程的 Binder 调用。
二、AMS 的启动流程:从 SystemServer 到服务就绪 2.1 SystemServer 的 main 入口 一切从 SystemServer 开始。SystemServer 由 Zygote 进程 fork 出来,是 system_server 进程的 Java 入口。
public static void main (String[] args) { new SystemServer ().run(); } private void run () { Looper.prepareMainLooper(); System.loadLibrary("android_servers" ); createSystemContext(); mSystemServiceManager = new SystemServiceManager (mSystemContext); startBootstrapServices(); startCoreServices(); startOtherServices(); Looper.loop(); }
2.2 startBootstrapServices 中启动 AMS AMS 是第一个被启动的引导服务,因为所有其他服务的管理都依赖 AMS。其启动通过 SystemServiceManager 的反射机制创建 Lifecycle 内部类:
private void startBootstrapServices () { mActivityManagerService = mSystemServiceManager.startService( ActivityManagerService.Lifecycle.class).getService(); mActivityManagerService.setSystemServiceManager(mSystemServiceManager); mActivityManagerService.setInstaller(installer); mActivityManagerService.initPowerManagement(); mActivityManagerService.setSystemProcess(); }
2.3 SystemServiceManager.startService 的反射机制 public <T extends SystemService > T startService (Class<T> serviceClass) { final String name = serviceClass.getName(); Constructor<T> constructor = serviceClass.getConstructor(Context.class); final T service = constructor.newInstance(mContext); mServices.add(service); service.onStart(); return service; }
2.4 ActivityManagerService.Lifecycle 内部类 这是 Android 系统服务的一种设计模式:将服务的构造和启动分离。Lifecycle 继承 SystemService,使得 AMS 的生命周期管理统一在 SystemService 框架之下。
public static final class Lifecycle extends SystemService { private final ActivityManagerService mService; public Lifecycle (Context context) { super (context); mService = new ActivityManagerService (context); } @Override public void onStart () { mService.start(); } @Override public void onBootPhase (int phase) { mService.mBootPhase = phase; if (phase == PHASE_SYSTEM_SERVICES_READY) { mService.mBatteryStatsService.systemServicesReady(); mService.mServices.systemServicesReady(); } } public ActivityManagerService getService () { return mService; } }
2.5 AMS 构造函数——初始化全貌 AMS 构造函数是整个服务初始化的核心,在这里创建了所有子管理模块。下面是核心初始化逻辑(精简了部分代码):
public ActivityManagerService (Context systemContext) { mContext = systemContext; mSystemThread = ActivityThread.currentActivityThread(); mHandlerThread = new ServiceThread (TAG, THREAD_PRIORITY_FOREGROUND, false ); mHandlerThread.start(); mHandler = new MainHandler (mHandlerThread.getLooper()); mFgBroadcastQueue = new BroadcastQueue (this , mHandler, "foreground" , BROADCAST_FG_TIMEOUT, false ); mBgBroadcastQueue = new BroadcastQueue (this , mHandler, "background" , BROADCAST_BG_TIMEOUT, true ); mBroadcastQueues[0 ] = mFgBroadcastQueue; mBroadcastQueues[1 ] = mBgBroadcastQueue; mServices = new ActiveServices (this ); mProviderMap = new ProviderMap (this ); mStackSupervisor = createStackSupervisor(); mActivityTaskManager = new ActivityTaskManagerService (this ); mActivityStartController = new ActivityStartController (this ); mProcessStats = new ProcessStatsService (this , new File (systemDir, "procstats" )); Watchdog.getInstance().addMonitor(this ); Watchdog.getInstance().addThread(mHandler); }
2.6 setSystemProcess——注册服务到 ServiceManager AMS 启动后,通过 setSystemProcess 将自身注册到 ServiceManager(即 Binder 大管家):
public void setSystemProcess () { ServiceManager.addService(Context.ACTIVITY_SERVICE, this , true , DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO); ServiceManager.addService("meminfo" , new MemBinder (this )); ServiceManager.addService("gfxinfo" , new GraphicsBinder (this )); ServiceManager.addService("cpuinfo" , new CpuBinder (this )); ServiceManager.addService("permission" , new PermissionController (this )); ApplicationInfo info = mContext.getPackageManager().getApplicationInfo( "android" , STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY); synchronized (this ) { ProcessRecord app = newProcessRecordLocked(info, info.processName, false , 0 ); app.persistent = true ; app.pid = MY_PID; app.maxAdj = ProcessList.SYSTEM_ADJ; mPidsSelfLocked.put(app.pid, app); updateLruProcessLocked(app, false , null ); updateOomAdjLocked(); } }
三、ATMS 拆分:Android 10 的架构重构 从 Android 10 开始,Google 将 AMS 中与 Activity 任务管理相关的职责拆分到了 ActivityTaskManagerService(ATMS)。这一重构主要体现在:
职责划分:
AMS :进程管理、Service、BroadcastReceiver、ContentProvider、OOM 调整、ANR 检测。
ATMS :Activity 启动、Task 和 Stack 管理、生命周期调度。
ATMS 的核心数据结构(保持兼容但重构了实现):
AOSP 路径:frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
AMS (ActivityManagerService) ├── ATMS (ActivityTaskManagerService) -- Android 10+ 新增 │ ├── RootWindowContainer -- Window 容器根节点 │ │ ├── DisplayContent -- 每个显示屏幕 │ │ │ └── TaskDisplayArea -- 任务显示区域 │ │ │ └── Task -- 任务(原名 ActivityStack) │ │ │ └── ActivityRecord -- Activity 记录 │ ├── ActivityStarter -- Activity 启动控制器 │ └── ActivityTaskSupervisor -- Activity Task 监管器 ├── ActiveServices -- Service 管理 ├── BroadcastQueue -- 广播队列(前台+后台) ├── ProviderMap -- ContentProvider 管理 └── OomAdjuster -- OOM 调整器(Android 11+)
在 Android 9 及之前版本中,ActivityStack 和 ActivityStackSupervisor 位于 AMS 内部(com.android.server.am 包下)。从 Android 10 开始,这些类迁移到 com.android.server.wm 包下,职责也更清晰。
四、startActivity 全链路追踪 4.1 三个阶段概述 startActivity 的执行过程分为三个主要阶段:
阶段一:Launcher/App 进程 → system_server(Binder IPC)
Activity.startActivity() → Activity.startActivityForResult() → Instrumentation.execStartActivity() → ActivityTaskManager.getService().startActivity() // Binder IPC → ATMS.startActivity()
阶段二:system_server 内部处理(ATMS → ActivityStarter → RootWindowContainer)
ATMS.startActivity() → ActivityStarter.execute() → ActivityStarter.startActivityUnchecked() → ActivityStarter.startActivityInner() → RootWindowContainer.resumeFocusedStacksTopActivities() → ActivityStack.startPausingLocked() // 暂停当前 Activity → ActivityStackSupervisor.startSpecificActivityLocked()
阶段三:system_server → App 进程(Binder IPC → 生命周期回调)
ATMS.realStartActivityLocked() // Binder 调用 → ApplicationThread.scheduleTransaction() // Binder IPC → ActivityThread.handleLaunchActivity() → Activity.onCreate() → Activity.onStart() → Activity.onResume()
4.2 关键代码:Instrumentation.execStartActivity Instrumentation 是 Android 测试框架的基础,同时也是系统与 Activity 之间的监控层:
public ActivityResult execStartActivity ( Context who, IBinder contextThread, IBinder token, Activity target, Intent intent, int requestCode, Bundle options) { int result = ActivityTaskManager.getService() .startActivity(whoThread, who.getBasePackageName(), intent, intent.resolveTypeIfNeeded(who.getContentResolver()), token, target != null ? target.mEmbeddedID : null , requestCode, 0 , null , options); checkStartActivityResult(result, intent); return null ; }
这里 ActivityTaskManager.getService() 返回的是 ATMS 的 Binder 代理:
public static IActivityTaskManager getService () { return IActivityTaskManagerSingleton.get(); } private static final Singleton<IActivityTaskManager> IActivityTaskManagerSingleton = new Singleton <IActivityTaskManager>() { @Override protected IActivityTaskManager create () { final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE); return IActivityTaskManager.Stub.asInterface(b); } };
4.3 ActivityStarter——启动决策核心 ActivityStarter 是 “解释如何以及然后启动一个 Activity 的控制器”。它收集所有关于如何将 Intent 和 flags 转化为 Activity 及其关联 Task 和 Stack 的逻辑。
class ActivityStarter { private final ActivityTaskManagerService mService; private final ActivityTaskSupervisor mSupervisor; int execute () { try { if (mRequest.activityInfo == null ) { mRequest.resolveActivity(mSupervisor); } res = executeRequest(mRequest); } finally { } return res; } private int startActivityUnchecked (final ActivityRecord r, ActivityRecord sourceRecord, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags, boolean doResume, ActivityOptions options, Task inTask, ActivityRecord[] outActivity, boolean restrictedBgActivity) { int result = START_SUCCESS; if (mStartActivity.resultTo == null && mLaunchSingleTop) { final Task task = mStartActivity.getTask(); final ActivityRecord top = task.getTopActivity(); if (top != null && !top.finishing && top.realActivity.equals(mStartActivity.realActivity)) { top.deliverNewIntentLocked(...); } } mTargetStack.startActivityLocked(mStartActivity, topFocused, newTask, mKeepCurTransition, mOptions); return result; } }
4.4 ActivityRecord 和 Task 的数据结构 final class ActivityRecord extends WindowToken { final ActivityManagerService mService; final IApplicationToken.Stub appToken; final ActivityInfo info; private Task task; enum State { INITIALIZING, STARTED, RESUMED, PAUSING, PAUSED, STOPPING, STOPPED, FINISHING, DESTROYING, DESTROYED, RESTARTING_PROCESS } private State state; ProcessRecord app; } class Task extends WindowContainer <WindowContainer> { final int mTaskId; void addActivityToTop (ActivityRecord r) { addChild(r, POSITION_TOP); } }
五、进程管理与 ProcessRecord 5.1 ProcessRecord 数据结构 ProcessRecord 是 AMS 描述每个进程的完整数据结构。以下是 AOSP 中的关键字段分类:
身份标识:
ApplicationInfo info — Manifest 中定义的 Application 信息
int uid — 进程 UID
int pid — 进程 PID
String processName — 进程名(默认等于包名)
IApplicationThread thread — ApplicationThread 的 Binder 代理,AMS 通过它向 App 进程发消息
组件记录(进程内运行的四大组件):
ArrayList<ActivityRecord> activities — 进程中所有 Activity
ArraySet<ServiceRecord> services — 进程中所有 Service
ArraySet<ReceiverList> receivers — 进程中所有 BroadcastReceiver
ContentProviderRecord[] pubProviders — 已发布的 ContentProvider
ArrayList<ContentProviderConnection> conProviders — 正在使用的 ContentProvider 连接
OOM 相关(进程调度核心):
int curAdj — 当前 OOM 调整值
int setAdj — 已设置的 OOM 调整值
int curProcState — 当前进程状态
int maxAdj — 最大 OOM 调整值
int adjSeq — OOM 调整周期序列号
int lruSeq — LRU 更新周期序列号
进程状态标志:
boolean persistent — 是否常驻内存
boolean crashing — 是否正在 crash
boolean notResponding — 是否处于 ANR 状态
boolean killedByAm — 是否被 AMS 所杀
boolean empty — 是否为空进程(无任何组件)
5.2 ProcessRecord 容器体系 AMS 维护多种容器来管理所有进程记录:
final ProcessMap<ProcessRecord> mProcessNames; final SparseArray<ProcessRecord> mPidsSelfLocked; final ArrayList<ProcessRecord> mLruProcesses; final ArrayList<ProcessRecord> mPersistentStartingProcesses; final ArrayList<ProcessRecord> mProcessesOnHold; final ArrayList<ProcessRecord> mProcessesToGc;
LRU 列表极为重要——越靠后的进程在内存不足时越优先被 kill。AMS 通过 updateLruProcessLocked 方法维护这个顺序。
六、ANR 检测机制详析 AMS 负责对 Android 系统的三类 ANR 进行检测和处理。
6.1 Service 超时检测(前台20秒,后台200秒) static final int SERVICE_TIMEOUT = 20 * 1000 ; static final int SERVICE_BACKGROUND_TIMEOUT = SERVICE_TIMEOUT * 10 ; void serviceTimeout (ProcessRecord proc) { if (proc.executingServices.size() > 0 ) { mAm.mAppErrors.appNotResponding(proc, null , null , false , "service timeout - " + proc.executingServices); } }
6.2 BroadcastReceiver 超时检测 static final int BROADCAST_FG_TIMEOUT = 10 * 1000 ; static final int BROADCAST_BG_TIMEOUT = 60 * 1000 ; final void processNextBroadcast (boolean fromMsg) { }
InputDispatcher 层面的超时由 InputManagerService 管理。当应用主线程在 5 秒内未响应输入事件时触发。AOSP 路径:
frameworks/native/services/inputflinger/dispatcher/InputDispatcher.cpp
6.4 ANR 处理流程 void appNotResponding (ProcessRecord proc, ActivityRecord activity, ActivityRecord parent, boolean aboveSystem, final String annotation) { File tracesFile = ActivityManagerService.dumpStackTraces( true , firstPids, lastPids, nativePids, null ); if (showBackground) { makeAppNotRespondingDialog(proc, activity); } else { mService.killAppAtUsersRequest(proc, null ); } }
七、OOM 调整与 Low Memory Killer 集成 AMS 通过 updateOomAdjLocked 方法持续计算每个进程的 oom_score_adj 值。这些值被写入 /proc/<pid>/oom_score_adj,供内核的 LMK 或用户空间的 lmkd 守候进程使用。
void updateOomAdjLocked () { applyOomAdjLocked(proc, true , now, nowElapsed); }
OOM ADJ 值体系(frameworks/base/services/core/java/com/android/server/am/ProcessList.java):
FOREGROUND_APP_ADJ = 0 — 前台应用
VISIBLE_APP_ADJ = 100 — 可见应用(如被对话框遮盖)
PERCEPTIBLE_APP_ADJ = 200 — 可感知应用(前台 Service)
BACKUP_APP_ADJ = 300 — 备份应用
HEAVY_WEIGHT_APP_ADJ = 400 — 重量级应用
SERVICE_ADJ = 500 — 有 Service 的进程
HOME_APP_ADJ = 600 — Launcher 应用
PREVIOUS_APP_ADJ = 700 — 上一个使用的应用
SERVICE_B_ADJ = 800 — 有后台 Service 的进程
CACHED_APP_MIN_ADJ = 900 — 缓存进程(最先被 kill)
CACHED_APP_MAX_ADJ = 906 — 最弱的缓存进程
UNKNOWN_ADJ = 1001 — 未知
SYSTEM_ADJ = -900 — 系统进程(永不 kill)
八、关键面试题 Q1:Android 10 为什么要从 AMS 拆分出 ATMS?拆分后两者的职责边界是什么?
AMS 代码量在 Android 9 时已超过 2 万行,维护极其困难。拆分后 ATMS 专门负责 Activity Task 管理(启动、Task 组织、生命周期),AMS 保留进程管理、Service/BroadcastReceiver/ContentProvider 管理、ANR/OOM 等职责。这种拆分符合单一职责原则,也使得窗口管理(WMS)与 Activity 管理(ATMS)的交互更自然(两者都在 com.android.server.wm 包下)。
Q2:startActivity 过程中,ApplicationThread 的 scheduleTransaction 是如何将任务调度到主线程的?
ApplicationThread 是 ActivityThread 的内部类,继承自 IApplicationThread.Stub。当 system_server 通过 Binder 调用 scheduleTransaction 时,Binder 线程执行该方法,它通过 Handler 向主线程发送消息(mH.sendMessage),从而将 ClientTransaction(封装了多种生命周期回调)调度到主线程的 MessageQueue 中,由主线程的 Looper 依次处理。
Q3:ANR 的检测原理是什么?谁在监测超时?
AMS 使用延迟消息机制检测 ANR。当调用目标进程执行某个操作时,AMS 的 Handler 会向自己的消息队列 post 一条延迟消息(Service 超时 20 秒、广播超时 10/60 秒)。如果目标进程在规定时间内完成操作并通知 AMS 移除这条延迟消息,则一切正常。如果延迟消息到期被处理,则说明超时,AMS 将触发 ANR 流程(收集 trace、显示对话框或杀进程)。
AOSP 核心路径参考:
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java
frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java
frameworks/base/services/core/java/com/android/server/am/ProcessRecord.java
frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java
frameworks/base/services/core/java/com/android/server/am/ActiveServices.java
frameworks/base/services/core/java/com/android/server/am/OomAdjuster.java
frameworks/base/core/java/android/app/ActivityTaskManager.java
frameworks/base/core/java/android/app/Instrumentation.java