1. ActivityManager 服务架构概览:核心组件、启动流程、系统服务注册

Android 系统中,ActivityManagerService (AMS) 是系统服务框架中最核心的组件之一,负责管理所有 Activity 的生命周期、任务栈、进程调度以及权限检查。理解 AMS 的架构是实现“边界控制”(例如限制后台启动、冻结进程、裁剪服务)的前提。

1.1 核心组件

组件名称所属层级职责简述
ActivityManagerServiceSystem ServerAMS 主服务,处理 Binder 调用,管理 Activity、Service、Broadcast、ContentProvider 的状态
ActivityTaskManagerServiceSystem Server专注 Activity 任务栈调度,与 AMS 分离后负责窗口焦点、启动模式等
ProcessRecordAMS 内部进程记录实体,保存 pid、uid、oom_adj、调度策略等,是边界控制的关键数据载体
ActivityRecordAMS 内部Activity 实例记录,包含 intent、生命周期状态、task 引用等
TaskRecordAMS 内部任务栈(Back Stack)记录,维护 ActivityRecord 的有序列表,决定返回与多窗口行为
ProcessListAMS 辅助统一管理所有 ProcessRecord,负责 OOM 调整、杀进程、缓存限制
ActivityStackSupervisorAMS 辅助管理多 Display、多 Task 的叠加关系,处理启动模式的决策
IntentResolverAMS 内部解析隐式 Intent,匹配 Activity/Service/Broadcast 等组件,影响系统响应边界
边界控制切入点:ProcessRecord.oom_adj 和 ProcessRecord.maxAdj 是后台启动拦截、冻结判断的依据;ActivityManagerService 的 startActivity 和 bindService 是定制权限与白名单的埋点位置。

1.2 启动流程(冷启动 Activity 为例)

  1. 发起端调用:App 通过 Binder 调用 AMS.startActivity(Intent)。
  2. 权限与边界检查:AMS 内部检查调用进程权限、后台启动限制(如 BACKGROUND_START_ACTIVITY 限制),若触发边界则返回错误或抑制启动。
  3. ActivityStackSupervisor 决策:解析 Intent,匹配目标 ActivityRecord,判断是否需要创建新 Task、复用已有 Task 或执行 singleTop 等启动模式。
  4. 进程创建:若目标进程未运行,AMS 通过 ProcessList 发送 CREATE_PROCESS 消息,Zygote 会 fork 新进程并绑定 Application。
  5. Activity 生命周期调度:AMS 依次调用 ActivityThread.handleLaunchActivity → handleResumeActivity,最终将界面显示到屏幕。
热启动场景:当目标 Activity 已在后台 Task 中且进程存活,AMS 仅执行 onPause/onResume 流程,不会重新创建进程。定制边界时常需区分“冷启动”与“热启动”的拦截策略。

1.3 系统服务注册

AMS 作为系统服务,在 SystemServer 进程启动时通过 ServiceManager.addService 注册到 Binder 上下文。注册名固定为 "activity"。

// SystemServer.java (AOSP 14)
private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
    t.traceBegin("StartActivityManager");
    mActivityManagerService = mSystemServiceManager.startService(
            ActivityManagerService.Lifecycle.class);
    ServiceManager.addService(Context.ACTIVITY_SERVICE, mActivityManagerService);
    t.traceEnd();
}

客户端通过 Context.getSystemService(Context.ACTIVITY_SERVICE) 获取 IActivityManager 代理接口,所有调用最终通过 Binder 到达 AMS。定制边界控制时可修改 ServiceManager 注册的 Binder 对象,或增加代理层实现拦截。

1.4 架构总览图

ActivityManager 服务架构核心组件与启动流程 客户端 App Context.startActivity() SystemServer 进程 ActivityManagerService Binder 服务端 ActivityTaskManagerService 任务栈调度 ProcessRecord oom_adj / maxAdj ActivityRecord Intent / state TaskRecord Back Stack Zygote 进程 fork 新进程 ServiceManager addService("activity") 完整启动流程(冷启动) 1. App 通过 Binder 调用 AMS.startActivity 2. AMS 做权限 & 后台启动边界检查 → ProcessRecord.maxAdj 判定 3. ActivityStackSupervisor 决策 Task / 启动模式 4. 若进程不存在 → 通知 Zygote fork → ActivityThread 绑定 Application

1.5 调试与验证

查看当前系统 AMS 运行状态及已注册的服务列表,常使用以下命令:

# 查看 activity 服务是否注册(Binder 名)
adb shell service list | grep activity

# 查看当前进程的 OOM 调优值(ProcessRecord 关键字段)
adb shell dumpsys activity oom

# 实时监控 AMS 启动 Activity 日志(过滤边界拦截)
adb logcat -s ActivityManager:V *:S
常见错误:在低版本 Android(如 8.0 以下)中,ActivityManagerService 和 ActivityTaskManagerService 未分离,所有 Activity 调度逻辑混在 AMS 内。定制边界控制时,需要区分系统版本对应的代码路径,避免引用错误的方法或类名。

1.6 性能与稳定性提示

  • 避免在 AMS 主线程阻塞:所有 Binder 调用默认在 AMS 主线程执行,任何自定义边界检查(如磁盘 I/O、网络请求)都应异步化,否则会导致全局桌面无响应(ANR)。
  • ProcessRecord 缓存策略:ProcessList 内部维护进程 LRU 缓存,频繁修改 maxAdj 会触发 OOM 重新排序,应批量更新而非逐条设置。
  • 最小化 Binder 通信:定制边界控制可能增加额外权限校验逻辑,建议将高频校验(如白名单匹配)放在 AMS 内部缓存中,减少跨进程查询(如查询 PackageManager)。