一、前文回顾
在前面的系列文章中,我们已经完整梳理出 Android 系统开机启动的核心链路,打通了从 Linux 内核到系统桌面的完整流程:
init 进程:Linux 用户空间首个进程,负责解析 rc 配置文件,拉起系统各类核心基础服务;
Zygote 进程:完成 ART 虚拟机初始化,是所有应用进程的“孵化器”,所有 App 进程均由其 fork 产生;
SystemServer 进程:由 Zygote 孵化,承载 Android Framework 几乎所有核心系统服务;
SystemServiceManager:系统服务管家,统一管控所有 Framework 服务的创建、启动与生命周期;
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 完整启动链路,重点解答四大核心问题:
AMS 如何在 SystemServer 中被创建、启动?
AMS 初始化阶段,加载了哪些核心模块与管控能力?
AMS、ATMS、WMS 三者的依赖与协作关系?
为何 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) {.............// 优先启动 ATMSActivityTaskManagerService atm = mSystemServiceManager.startService(ActivityTaskManagerService.Lifecycle.class).getService();// 依托 ATMS 启动 AMSmActivityManagerService = 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);// 构造方法中真正初始化 AMSmService = new ActivityManagerService(context, sAtm);}// SystemServiceManager 统一启动入口publicstatic ActivityManagerService startService(SystemServiceManager ssm, ActivityTaskManagerService atm) {sAtm = atm;// 反射创建 Lifecycle,进而初始化 AMSreturn 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(this, true); // 内容提供者管理// 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 完整调用链如下:
SystemServer.startBootstrapServices()触发 AMS.Lifecycle.startService()SystemServiceManager.startService(Class)反射创建 Lifecycle 实例Lifecycle 构造方法中 new AMS,完成核心模块初始化
SystemServiceManager.startService(实例)调用生命周期onStart()触发 AMS 真正启动,完成服务注册与系统绑定
核心机制:通过内部 Lifecycle 继承 SystemService,适配系统服务统一生命周期管理,是所有 Framework 核心服务的通用启动范式。
三、setSystemProcess:AMS 注册与系统绑定核心流程
AMS 初始化完成后,会调用 setSystemProcess(),这是 AMS 从“初始化完成”到“正式对外提供服务”的关键步骤,主要完成 Binder 服务注册、系统进程绑定、进程管控纳入 三大核心工作。
public void setSystemProcess() {try {// 1. 向 ServiceManager 注册各类系统 Binder 服务,对外开放跨进程调用ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true,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, false, null);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 页面 ResumemAtmInternal.resumeTopActivities(false);}
4.1 开机常驻应用启动流程
系统就绪后,会自动启动清单文件中配置 android:persistent="true" 的系统常驻应用(电话、NFC、系统组件等),核心入口为 startPersistentApps,最终调用addAppLocked 创建应用进程。
addAppLocked 核心逻辑:
根据 UID+进程名 查找是否已存在对应 ProcessRecord;
不存在则新建进程记录,加入 LRU 进程链表(用于后台回收排序);
标记常驻应用最高内存优先级,防止被系统回收;
调用
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 与系统服务通信 BindermToken,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 执行核心逻辑。
核心工作:
校验 Intent 合法性、解析目标 Activity 组件信息;
校验跳转权限、后台启动限制(BAL)、防火墙拦截;
处理权限授权、瞬时应用安装等特殊分支;
构建 ActivityRecord(目标页面核心记录对象);
调用
startActivityUnchecked处理启动模式与任务栈。
5.5 startActivityInner:启动模式与任务栈核心处理
startActivityInner 是四大启动模式(standard/singleTop/singleTask/singleInstance)的核心处理方法,全权负责:
任务栈 Task 复用/新建逻辑;
栈内页面复用、上层页面销毁逻辑;
singleTop 模式 onNewIntent 回调触发;
页面任务栈前台切换、动画调度。
最终调用 mRootWindowContainer.resumeFocusedTasksTopActivities,触发新旧页面的前台切换与生命周期调度。
5.6 页面Resume与进程创建最终链路
从 RootWindowContainer → Task → TaskFragment 层层调度,最终完成页面切换:
暂停当前前台 Activity(pause);
判断目标 App 进程是否存在;
进程存在:直接跨进程调度 Activity 生命周期(onResume、onNewIntent);
进程不存在:调用
startSpecificActivity→startProcessAsync拉起新进程。
进程创建核心入口:ActivityTaskSupervisor.startSpecificActivity,这也是下一篇文章重点拆解的App 进程 fork 创建全流程。
六、核心知识点总结
AMS 定位:Android Framework 进程与组件调度中枢,运行于 system_server 进程,是系统真正的“大管家”;
AMS&ATMS 关系:高版本拆分架构,ATMS 负责任务栈、页面启停,AMS 负责进程、权限、内存、组件调度,双向依赖、协同工作;
启动核心流程:SystemServer 引导启动 → 反射初始化核心模块 → 注册 Binder 服务 → 绑定系统进程 → systemReady 就绪拉起应用与桌面;
页面启动跨进程链路:App startActivity → Instrumentation → ATMS → ActivityStarter → 任务栈处理 → 进程创建/生命周期调度;
进程创建时机:启动目标页面时,检测进程不存在,则由 AMS 调度 Zygote fork 全新应用进程。
流程图:
SystemServer|-------------------------| |ATMS AMS| |Activity调度 进程/组件管理| |-----------+------------|systemReady|vApp启动请求|vApp → Instrumentation → ATMS|vActivityStarter|-------------------------| |进程存在 进程不存在| |v v生命周期调度 AMS|vZygote|vApp进程创建
七、下篇预告
本文梳理完 AMS 启动与 Activity 启动整体链路,下篇将深度拆解 App 进程创建核心流程:
startProcessAsync → Zygote 套接字通信 → fork 进程 → 应用初始化全流程,彻底搞懂 Android 应用进程的诞生原理。
夜雨聆风