乐于分享
好东西不私藏

Android Framework源码解析(八):Android 系统大管家 AMS —— ActivityManagerService 启动全流程解析-1

Android Framework源码解析(八):Android 系统大管家 AMS —— ActivityManagerService 启动全流程解析-1

一、前文回顾

在前面的系列文章中,我们已经完整梳理出 Android 系统开机启动的核心链路,打通了从 Linux 内核到系统桌面的完整流程:

  1. init 进程:Linux 用户空间首个进程,负责解析 rc 配置文件,拉起系统各类核心基础服务;

  2. Zygote 进程:完成 ART 虚拟机初始化,是所有应用进程的“孵化器”,所有 App 进程均由其 fork 产生;

  3. SystemServer 进程:由 Zygote 孵化,承载 Android Framework 几乎所有核心系统服务;

  4. SystemServiceManager:系统服务管家,统一管控所有 Framework 服务的创建、启动与生命周期;

  5. BootAnimation、Launcher3:实现开机开机动画播放、系统桌面加载,完成用户可视的开机收尾流程。

梳理完基础启动链路后,几个核心核心问题应运而生:

  • 桌面应用 Launcher 到底由谁启动?

  • 所有第三方 App 的应用进程是谁负责创建、调度?

  • Android 四大组件的生命周期由谁统一管控、分发?

以上所有问题的核心答案,都指向 Android Framework 的核心中枢服务 —— AMS(ActivityManagerService)

AMS 是 Android Framework 中负责应用运行状态管理的核心服务之一,是连接应用进程、系统服务与用户交互的重要调度中心,掌控着应用层几乎所有核心逻辑,是进阶 Framework 开发、性能优化、ANR 卡顿排查的必学核心。

AMS 核心职责全覆盖:

  • 应用进程的创建、回收、优先级调度管理

  • Activity 四大组件全生命周期调度

  • Service、Broadcast、ContentProvider 统一调度分发

  • 应用前后台切换、任务栈(Task)管理

  • 应用 ANR 异常检测、触发与日志收集

  • 系统内存回收、进程 OOM 优先级调整

几乎所有 App 上层行为,最终都会经过 AMS 统一调度管控。因此,吃透 AMS 启动流程,是深入 Android Framework 底层的关键一步。

本篇文章将基于原生源码,深度拆解 AMS 完整启动链路,重点解答四大核心问题:

  1. AMS 如何在 SystemServer 中被创建、启动?

  2. AMS 初始化阶段,加载了哪些核心模块与管控能力?

  3. AMS、ATMS、WMS 三者的依赖与协作关系?

  4. 为何 AMS 能成为 Android Framework 的中央调度核心?

二、AMS 整体启动架构

首先明确核心结论:AMS 运行在 system_server 进程中,属于系统核心引导服务,开机优先启动

SystemServer 启动时,会在 startBootstrapServices 阶段初始化 AMS、ATMS 等核心基础服务,这是 AMS 的启动入口。

2.1 服务启动入口源码

文件路径:services/java/com/android/server/SystemServer.java

private void startBootstrapServices(@NonNullTimingsTraceAndSlog t) {      .............    // 优先启动 ATMS    ActivityTaskManagerService atm = mSystemServiceManager.startService(            ActivityTaskManagerService.Lifecycle.class).getService();    // 依托 ATMS 启动 AMS    mActivityManagerService = ActivityManagerService.Lifecycle.startService(            mSystemServiceManager, atm);    mActivityManagerService.setSystemServiceManager(mSystemServiceManager);    mActivityManagerService.setInstaller(installer);    mWindowManagerGlobalLock = atm.getGlobalLock();    // 将 AMS 注册到 ServiceManager,对外开放 Binder 调用    mActivityManagerService.setSystemProcess();    ..............}

Android 10 之后,Activity 管理相关职责从 AMS 中拆分到了 ATMS。SystemServer 启动阶段会先创建 ATMS,再创建 AMS,并通过依赖注入建立两者关联。

Android 高版本将原 AMS 中的任务栈、Activity 调度逻辑拆分,独立出ATMS(ActivityTaskManagerService),专门负责任务栈管理、页面启停调度,AMS 则专注于进程管理、组件调度、系统管控,二者紧密协作。

2.2 AMS 核心构造方法初始化

AMS 并不会直接 new 创建,而是通过内部静态生命周期类 Lifecycle 接入 SystemService 统一管理,由系统服务管理器反射实例化。

文件路径:services/core/java/com/android/server/am/ActivityManagerService.java

publicLifecycle(Context context) {    super(context);    // 构造方法中真正初始化 AMS    mService = new ActivityManagerService(context, sAtm);}// SystemServiceManager 统一启动入口publicstatic ActivityManagerService startService(        SystemServiceManager ssm, ActivityTaskManagerService atm) {    sAtm = atm;    // 反射创建 Lifecycle,进而初始化 AMS    return ssm.startService(ActivityManagerService.Lifecycle.class).getService();}

2.3 AMS 核心初始化模块

AMS 构造方法是整个服务初始化的核心,一次性初始化进程管理、广播调度、内存管控、用户管理、异常监控等所有核心能力,关键源码解析如下:

public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) {    // 全局锁校验,防止死锁    LockGuard.installLock(this, LockGuard.INDEX_ACTIVITY);    mInjector = new Injector(systemContext);    // 保存 system_server 系统上下文    mContext = systemContext;    // 获取 system_server 自身的 ActivityThread(system_server 是特殊 App 进程)    mSystemThread = ActivityThread.currentActivityThread();    // 1. 核心线程初始化:主线程 + 进程启动专属线程    mHandlerThread = new ServiceThread(TAG, THREAD_PRIORITY_FOREGROUND, false);    mHandlerThread.start();    mHandler = new MainHandler(mHandlerThread.getLooper());    // 独立线程专门处理 App 进程 fork 创建,避免阻塞主线程    mProcStartHandlerThread = new ServiceThread(TAG + ":procStart", THREAD_PRIORITY_FOREGROUND, false);    mProcStartHandlerThread.start();    mProcStartHandler = new ProcStartHandler(this, mProcStartHandlerThread.getLooper());    // 2. 进程、内存、OOM 优先级管理模块    mConstants = new ActivityManagerConstants(mContext, this, mHandler);    mProcessList = mInjector.getProcessList(this); // 进程列表管理器    mOomAdjuster = new OomAdjusterModernImpl(this, mProcessList, activeUids); // OOM 内存调整器    // 3. 四大组件调度核心    mBroadcastQueue = mInjector.getBroadcastQueue(this); // 广播队列管理    mServices = new ActiveServices(this); // Service 服务管理    mCpHelper = new ContentProviderHelper(thistrue); // 内容提供者管理    // 4. 应用异常、崩溃监控    mPackageWatchdog = PackageWatchdog.getInstance(mUiContext); // 应用看门狗    mAppErrors = new AppErrors(mUiContext, this, mPackageWatchdog); // 应用错误收集    // 5. 多用户、权限、后台管控    mUserController = new UserController(this); // 多用户/访客模式管理    mAppOpsService = mInjector.getAppOpsService(...); // 应用权限、后台管控    // 6. 与 ATMS 双向绑定,注入依赖    mActivityTaskManager = atm;    mActivityTaskManager.initialize(mIntentFirewall, mPendingIntentController, DisplayThread.get().getLooper());    mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class);    // 7. 系统全局看门狗监控,防止系统卡死    Watchdog.getInstance().addMonitor(this); // 监控 AMS 全局锁死锁    Watchdog.getInstance().addThread(mHandler); // 监控 AMS 主线程阻塞}

核心初始化总结

  • 创建独立主线程、进程启动专属线程,保证进程创建不阻塞系统核心逻辑;

  • 初始化进程列表、OOM 内存调控模块,管控所有 App 进程优先级与内存回收;

  • 初始化广播、Service、ContentProvider 管理器,实现四大组件统一调度;

  • 绑定 ATMS,实现进程管理与任务栈、页面调度的解耦协作;

  • 接入系统看门狗,监控 AMS 死锁、主线程阻塞,触发系统 ANR/重启保护。

2.4 AMS 标准启动调用链

所有系统服务均遵循 SystemService 统一启动规范,AMS 完整调用链如下:

  1. SystemServer.startBootstrapServices() 触发 AMS.Lifecycle.startService()

  2. SystemServiceManager.startService(Class) 反射创建 Lifecycle 实例

  3. Lifecycle 构造方法中 new AMS,完成核心模块初始化

  4. SystemServiceManager.startService(实例) 调用生命周期 onStart()

  5. 触发 AMS 真正启动,完成服务注册与系统绑定

核心机制:通过内部 Lifecycle 继承 SystemService,适配系统服务统一生命周期管理,是所有 Framework 核心服务的通用启动范式

三、setSystemProcess:AMS 注册与系统绑定核心流程

AMS 初始化完成后,会调用 setSystemProcess(),这是 AMS 从“初始化完成”到“正式对外提供服务”的关键步骤,主要完成 Binder 服务注册、系统进程绑定、进程管控纳入 三大核心工作。

public void setSystemProcess() {    try {        // 1. 向 ServiceManager 注册各类系统 Binder 服务,对外开放跨进程调用        ServiceManager.addService(Context.ACTIVITY_SERVICE, thistrue,                DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO);        ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats); // 进程统计        ServiceManager.addService("meminfo"new MemBinder(this)); // 内存信息        ServiceManager.addService("gfxinfo"new GraphicsBinder(this)); // 图形渲染信息        ServiceManager.addService("permission"new PermissionController(this)); // 权限管控        // 2. 获取系统 android 包信息,绑定 system_server 应用信息        ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(                "android", STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY);        mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());        // 3. 创建 system_server 对应的 ProcessRecord,纳入 AMS 进程管理体系        synchronized (this) {            ProcessRecord app = mProcessList.newProcessRecordLocked(info, info.processName,                    false,0,false,0,null,new HostingRecord(HostingRecord.HOSTING_TYPE_SYSTEM));            app.setPersistent(true); // 标记为系统常驻进程            app.setPid(MY_PID);            app.makeActive(mSystemThread.getApplicationThread(), mProcessStats);            addPidLocked(app);            updateLruProcessLocked(app, falsenull);            updateOomAdjLocked(OOM_ADJ_REASON_SYSTEM_INIT);        }        // 4. 注册权限监听:后台运行权限、相机状态监听        mAppOpsService.startWatchingMode(AppOpsManager.OP_RUN_IN_BACKGROUND, null, ...);        mAppOpsService.startWatchingActive(new int[]{AppOpsManager.OP_CAMERA}, ...);    } catch (PackageManager.NameNotFoundException e) {        throw new RuntimeException("Unable to find android system package", e);    }}

核心作用拆解

  • 服务注册:将 AMS、内存、权限、进程统计等服务注册到 ServiceManager,所有 App 可通过 Binder 跨进程调用;

  • 系统进程绑定:给 system_server 进程创建专属 ProcessRecord,让 AMS 自身可以管理系统进程;

  • 权限监听:实时监听应用后台运行、相机使用状态,管控应用权限行为。

四、systemReady:系统就绪,开启应用调度

当 SystemServer 所有核心服务启动完成后,会调用 AMS.systemReady(),标志 系统开机流程完成,正式进入就绪状态,可以正常拉起应用、调度组件

该方法核心工作:通知所有子模块就绪、清理开机残留进程、启动常驻应用、拉起桌面 Launcher。

public void systemReady(final Runnable goingCallback, @NonNullTimingsTraceAndSlog t) {    synchronized(this) {        if (mSystemReady) { // 防止重复执行            goingCallback.run();            return;        }        // 通知各大核心模块系统就绪        mActivityTaskManager.onSystemReady();        mUserController.onSystemReady();        mAppOpsService.systemReady();        mProcessList.onSystemReady();        mSystemReady = true;    }    // 清理系统升级残留的临时进程    killSystemUpdateProcess();    // 标记系统就绪,允许拉起应用进程    synchronized(this) {        mProcessesReady = true;    }    // 启动所有常驻应用(persistent=true 系统核心应用)    startPersistentApps(PackageManager.MATCH_DIRECT_BOOT_AWARE);    // 通知 ATMS 启动桌面 Launcher,加载系统桌面    if (isBootingSystemUser && !UserManager.isHeadlessSystemUserMode()) {        mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");    }    // 发送系统开机、用户启动广播    sendUserBootBroadcast();    // 恢复顶层 Activity,触发 Launcher 页面 Resume    mAtmInternal.resumeTopActivities(false);}

4.1 开机常驻应用启动流程

系统就绪后,会自动启动清单文件中配置 android:persistent="true" 的系统常驻应用(电话、NFC、系统组件等),核心入口为 startPersistentApps,最终调用addAppLocked 创建应用进程。

addAppLocked 核心逻辑:

  1. 根据 UID+进程名 查找是否已存在对应 ProcessRecord;

  2. 不存在则新建进程记录,加入 LRU 进程链表(用于后台回收排序);

  3. 标记常驻应用最高内存优先级,防止被系统回收;

  4. 调用 startProcessLocked 通知 Zygote fork 真实应用进程。

五、App 启动 Activity 完整跨进程链路

了解完 AMS 启动流程后,我们延伸到日常开发最常用的 startActivity,完整拆解 App 进程 → system_server 进程 的跨页面启动、进程创建全流程。

5.1 App 上层调用入口

文件路径:frameworks/base/core/java/android/app/Activity.java

public void startActivity(Intent intent, @NullableBundle options) {    // 最终复用 startActivityForResult,requestCode=-1 无需返回结果    if (options != null) {        startActivityForResult(intent, -1, options);    } else {        startActivityForResult(intent, -1);    }}public void startActivityForResult(Intent intent, int requestCode, Bundle options) {    if (mParent == null) {        // 核心中转:交给 Instrumentation 处理        mInstrumentation.execStartActivity(                this,                mMainThread.getApplicationThread(), // App 与系统服务通信 Binder                mToken,                this,                intent,                requestCode, options);        cancelInputsAndStartExitTransition(options);    }}

5.2 Instrumentation:跨进程调用中转站

Instrumentation 是 App 与系统服务的核心中转类,所有组件启动、生命周期调度都会经过它,最终发起 Binder 跨进程调用 ATMS。

文件路径:frameworks/base/core/java/android/app/Instrumentation.java

public ActivityResult execStartActivity(...) {    // 省略测试拦截逻辑    try {        // 核心:Binder 跨进程调用 ATMS 的 startActivity 方法        int result = ActivityTaskManager.getService().startActivity(                whoThread,                who.getOpPackageName(),                who.getAttributionTag(),                intent,                intent.resolveTypeIfNeeded(who.getContentResolver()),                token,                target != null ? target.mEmbeddedID : null,                requestCode,                0,                null,                options);        checkStartActivityResult(result, intent);    } catch (RemoteException e) {        throw new RuntimeException("Failure from system", e);    }    return null;}

关键流程:App 进程通过 Binder 调用 system_server 进程的 ATMS,将页面启动权限、任务栈调度、进程创建全权交给系统服务处理。

5.3 ATMS:页面启动与任务栈调度核心

ATMS 接收跨进程请求后,通过 ActivityStarter 构建启动参数,执行页面启动全流程,核心采用 Builder 模式封装启动请求。

文件路径:frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java

publicintstartActivityAsUser(...) {    return getActivityStartController().obtainStarter(intent, "startActivityAsUser")            .setCaller(caller)            .setCallingPackage(callingPackage)            .setResolvedType(resolvedType)            .setResultTo(resultTo)            .setRequestCode(requestCode)            .setActivityOptions(opts)            .setUserId(userId)            .execute();}

5.4 ActivityStarter:页面启动全流程执行者

ActivityStarter.execute() 是页面启动的总入口,完成参数校验、权限校验、组件解析,最终通过 executeRequest 执行核心逻辑。

核心工作:

  1. 校验 Intent 合法性、解析目标 Activity 组件信息;

  2. 校验跳转权限、后台启动限制(BAL)、防火墙拦截;

  3. 处理权限授权、瞬时应用安装等特殊分支;

  4. 构建 ActivityRecord(目标页面核心记录对象);

  5. 调用 startActivityUnchecked 处理启动模式与任务栈。

5.5 startActivityInner:启动模式与任务栈核心处理

startActivityInner 是四大启动模式(standard/singleTop/singleTask/singleInstance)的核心处理方法,全权负责:

  • 任务栈 Task 复用/新建逻辑;

  • 栈内页面复用、上层页面销毁逻辑;

  • singleTop 模式 onNewIntent 回调触发;

  • 页面任务栈前台切换、动画调度。

最终调用 mRootWindowContainer.resumeFocusedTasksTopActivities,触发新旧页面的前台切换与生命周期调度。

5.6 页面Resume与进程创建最终链路

从 RootWindowContainer → Task → TaskFragment 层层调度,最终完成页面切换:

  1. 暂停当前前台 Activity(pause);

  2. 判断目标 App 进程是否存在;

  3. 进程存在:直接跨进程调度 Activity 生命周期(onResume、onNewIntent);

  4. 进程不存在:调用 startSpecificActivity → startProcessAsync 拉起新进程。

进程创建核心入口:ActivityTaskSupervisor.startSpecificActivity,这也是下一篇文章重点拆解的App 进程 fork 创建全流程

六、核心知识点总结

  1. AMS 定位:Android Framework 进程与组件调度中枢,运行于 system_server 进程,是系统真正的“大管家”;

  2. AMS&ATMS 关系:高版本拆分架构,ATMS 负责任务栈、页面启停,AMS 负责进程、权限、内存、组件调度,双向依赖、协同工作;

  3. 启动核心流程:SystemServer 引导启动 → 反射初始化核心模块 → 注册 Binder 服务 → 绑定系统进程 → systemReady 就绪拉起应用与桌面;

  4. 页面启动跨进程链路:App startActivity → Instrumentation → ATMS → ActivityStarter → 任务栈处理 → 进程创建/生命周期调度;

  5. 进程创建时机:启动目标页面时,检测进程不存在,则由 AMS 调度 Zygote fork 全新应用进程。

  6. 流程图:

                 SystemServer                      |          -------------------------          |                       |         ATMS                    AMS          |                       |   Activity调度             进程/组件管理          |                       |          -----------+------------                      |                 systemReady                      |                      v                 App启动请求                      |                      v        App → Instrumentation → ATMS                                  |                                  v                           ActivityStarter                                  |                    -------------------------                    |                       |                进程存在               进程不存在                    |                       |                    v                       v              生命周期调度              AMS                                            |                                            v                                         Zygote                                            |                                            v                                       App进程创建

七、下篇预告

本文梳理完 AMS 启动与 Activity 启动整体链路,下篇将深度拆解 App 进程创建核心流程

startProcessAsync → Zygote 套接字通信 → fork 进程 → 应用初始化全流程,彻底搞懂 Android 应用进程的诞生原理。