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文件系统或直接系统调用间接感知内核状态。
1.2 关键组件与核心职责
| 组件/模块 | 核心职责 | 数据结构 | 与AMS的关系 |
|---|---|---|---|
| ActivityManagerService (主控) | 统一调度Activity、Service、Broadcast、ContentProvider的声明周期;管理进程优先级与OOM adj | mActivities, mServices, mProcessMap | — |
| ActivityStackSupervisor | 管理所有ActivityStack,处理启动模式、任务栈复用、窗口覆盖判定 | mActivityDisplays, HomeStack, FullscreenStack | AMS通过它进行Activity堆栈决策 |
| ActivityRecord | 单个Activity的运行时记录,包含Intent、流程、状态枚举 | state: INITIALIZING→RESUMED→PAUSED→STOPPED→FINISHING | AMS生命周期调度的最小单元 |
| ProcessRecord | 映射一个应用进程,记录pid/uid/oom_score_adj/绑定服务列表 | mServices, mProviders, pid, adjType | AMS通过它管理进程优先级与杀进程 |
| BroadcastQueue | 按优先级(前台/后台)排队广播,处理Ordered/Sticky广播 | mParallelBroadcasts, mOrderedBroadcasts | AMS委托它进行广播分派与超时监控 |
| ServiceMap | 按用户、进程、Intent存储已注册/运行的Service | mServicesByIntent, mServicesByProcess | AMS查询它来决定Service启动/绑定 |
| Binder Service(IApplicationThread) | 应用进程侧的AMS回调接口(schedulePauseActivity/scheduleStop等) | — | AMS通过Binder反向调用应用进程 |
1.3 数据流与控制流特征
AMS的通信以Binder为核心,主通道方向为:
- 下行控制流:应用进程(Client)→ Binder → AMS → 调度决策 → 写队列/改状态 → 回调IApplicationThread → 应用进程执行。
- 上行数据流:应用进程通过Binder向AMS报告组件状态变更(如onResume完成、onStop完成),AMS据此推进状态机。
- 跨服务协同: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) 高并发启动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);验收需通过
- CTS/VTS中ActivityManager相关case全部pass;
- 连续24小时Monkey/Running Test无AMS崩溃或ANR;
- 系统服务堆栈大小(/proc/sys/kernel/threads-max)不变,无内存泄漏。
| 验收维度 | 指标 | 通过标准 |
|---|---|---|
| 功能正确性 | Activity跳转/Service启动/广播分派 | CTS onStart/onResume/onBind回调时序完全符合Android官方规范 |
| 性能表现 | AMS主线程消息处理耗时 | 常规场景单次startActivity耗时 < 5ms(中位数) |
| 稳定性 | AMS进程自身不崩溃 | 压力测试60分钟0 crash |
| 安全隔离 | 跨进程权限检查 | 外部应用无法通过Binder注入非授权Intent开启隐藏组件 |