1. AMS总体架构图与系统分层

ActivityManagerService(AMS)是Android系统服务中规模最大、职责最复杂的核心模块,位于SystemServer进程的核心位置。理解AMS的架构需要从系统分层切入,明确其与周边服务(WMS、PMS等)、Native层以及应用进程之间的边界与通信方式。本章作为课程总纲,先建立AMS在整个Android系统中的空间定位与职责边界图谱。

1.1 系统分层与AMS的边界

AMS运行在独立的SystemServer进程内(uid=system),通过Binder IPC暴露接口。分层视角下的AMS位于以下位置:

  • 应用层(Application Layer):通过Context.startActivity/Service等API发起请求,经Binder跨进程到达SystemServer。
  • 系统服务层(System Services Layer):AMS、WMS、PMS等核心服务在此协同,共享SystemServer进程空间。
  • 核心库层(Core Libraries):包含Android Runtime(ART)、Binder驱动支撑层。
  • 内核层(Kernel Layer):提供进程管理、内存管理、Binder驱动、文件系统等底层能力。
关键边界:AMS不直接访问硬件或内核调度,它通过Binder接收上层请求,通过简单调用或回调与WMS/PMS等兄弟服务交互,通过/proc文件系统或直接系统调用间接感知内核状态。
Android系统分层与AMS模块边界 应用层(Application Layer) Context · Activity · Service · BroadcastReceiver · ContentProvider 系统服务层(System Services Layer)- SystemServer进程 AMS ActivityRecord · TaskRecord WMS Window管理 PMS Package管理 AMS 核心职责域(虚线内为内部组件) ActivityStackSupervisor ProcessRecord ServiceMap BroadcastQueue Native层 & Runtime层 ART · libbinder · SurfaceFlinger · MediaServer 内核层(Kernel Layer) Binder驱动 · Linux 进程调度 · OOM Killer · 内存管理 通过Binder IPC

1.2 关键组件与核心职责

组件/模块核心职责数据结构与AMS的关系
ActivityManagerService (主控)统一调度Activity、Service、Broadcast、ContentProvider的声明周期;管理进程优先级与OOM adjmActivities, mServices, mProcessMap—
ActivityStackSupervisor管理所有ActivityStack,处理启动模式、任务栈复用、窗口覆盖判定mActivityDisplays, HomeStack, FullscreenStackAMS通过它进行Activity堆栈决策
ActivityRecord单个Activity的运行时记录,包含Intent、流程、状态枚举state: INITIALIZING→RESUMED→PAUSED→STOPPED→FINISHINGAMS生命周期调度的最小单元
ProcessRecord映射一个应用进程,记录pid/uid/oom_score_adj/绑定服务列表mServices, mProviders, pid, adjTypeAMS通过它管理进程优先级与杀进程
BroadcastQueue按优先级(前台/后台)排队广播,处理Ordered/Sticky广播mParallelBroadcasts, mOrderedBroadcastsAMS委托它进行广播分派与超时监控
ServiceMap按用户、进程、Intent存储已注册/运行的ServicemServicesByIntent, mServicesByProcessAMS查询它来决定Service启动/绑定
Binder Service(IApplicationThread)应用进程侧的AMS回调接口(schedulePauseActivity/scheduleStop等)—AMS通过Binder反向调用应用进程

1.3 数据流与控制流特征

AMS的通信以Binder为核心,主通道方向为:

  1. 下行控制流:应用进程(Client)→ Binder → AMS → 调度决策 → 写队列/改状态 → 回调IApplicationThread → 应用进程执行。
  2. 上行数据流:应用进程通过Binder向AMS报告组件状态变更(如onResume完成、onStop完成),AMS据此推进状态机。
  3. 跨服务协同:AMS与WMS通过WindowManagerService.session.mActivityManager互相持有短引用;与PMS通过PackageManagerInternal接口查询组件信息。
信任链路:所有跨进程通信均经过Binder内核驱动鉴权(uid/pid校验),AMS内部通过记录调用方uid来做权限校验(如checkCallingPermission)。关键场景(如停止当前Focus Activity)必须由应用自身IApplicationThread回调触发,防止外部进程恶意操控前台组件。

1.4 设计权衡与风险点

设计取舍权衡点风险/代价
全局单例SystemServer进程节省进程间IPC开销;全局状态统一管理AMS/Core Service OOM即系统奔溃;单进程AIDL调用频繁则主线程阻塞
Binder全双工通信无需额外连接管理;自动线程池Binder线程池耗尽(默认16~32)时出现同步阻塞,导致ANR
状态机+异步消息驱动可预测的状态推进;便于追踪若状态机异常(如double finish),边界修复困难
ProcessRecord绑定OOM adj精确控制保活优先级调优不当会导致后台进程洪泛或系统卡顿
已知风险TOP3:
(1) 高并发启动Activity时AMS主线程消息积压,直接导致系统不可用;
(2) Binder传输大对象(如大型Intent)因fding不足/data有限而异常;
(3) broadcast receiver注册不规范导致AMS链表膨胀,内存泄漏。

1.5 关键源码片段解析

AMS作为Binder服务导出,其实就是继承了IActivityManager.Stub,其核心结构可简化为:

// frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
public class ActivityManagerService extends IActivityManager.Stub
        implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
    
    // 核心数据结构(精简)
    final ActivityStackSupervisor mStackSupervisor;
    final ProcessMap<ProcessRecord> mProcessMap;
    final ServiceMap mServices;
    final BroadcastQueue[] mBroadcastQueues;
    final SparseArray<ProcessRecord> mPidsSelfLocked;
    
    @Override
    public int startActivity(IApplicationThread caller, String packageName,
            Intent intent, ...) {
        // 1. 权限检查
        // 2. 解析Intent确认目标Activity
        // 3. 与任务栈交互(通过mStackSupervisor)
        // 4. 进程/线程调度
        // 5. 回调应用进程执行生命周期
    }
}

AMS虽是一个Java对象,但由于其全局重要性,初始化必须发生在SystemServer的run()方法早期,并注册到ServiceManager:

// frameworks/base/services/java/com/android/server/SystemServer.java
private void run() {
    // ...
    try {
        Slog.i(TAG, "Activity Manager");
        ActivityManagerService am = new ActivityManagerService(context,
                new ActivityTaskManagerService(context));
        ServiceManager.addService(Context.ACTIVITY_SERVICE, am);
    } catch (Throwable e) {
        Slog.e(TAG, "Failure starting Activity Manager", e);
        // 若AMS启动失败,系统将直接进入panic
    }
    // ...
}

1.6 落地步骤与验收标准

在尝试修改或定制AMS时,建议按以下步骤安全推进:

  • Step 1:梳理目标分层边界,明确新功能属于AMS内部(如新增生命周期状态)还是跨服务(与WMS/PMS的新交互)。
  • Step 2:在AOSP源码中定义精确的Binder接口(.aidl文件),编译通过后再填充实现逻辑。
  • Step 3:添加单元测试导向:最小可验证是AMS单进程单元测试(使用tests/ams_test);验收需通过
    1. CTS/VTS中ActivityManager相关case全部pass;
    2. 连续24小时Monkey/Running Test无AMS崩溃或ANR;
    3. 系统服务堆栈大小(/proc/sys/kernel/threads-max)不变,无内存泄漏。
验收维度指标通过标准
功能正确性Activity跳转/Service启动/广播分派CTS onStart/onResume/onBind回调时序完全符合Android官方规范
性能表现AMS主线程消息处理耗时常规场景单次startActivity耗时 < 5ms(中位数)
稳定性AMS进程自身不崩溃压力测试60分钟0 crash
安全隔离跨进程权限检查外部应用无法通过Binder注入非授权Intent开启隐藏组件