一、AMS 是什么?—— 系统的核心调度中心
AMS 是 Android 系统中最核心的服务之一,全称 ActivityManagerService,但它的功能远不止管理 Activity!
- 位置:运行在
systemserver进程中(系统启动后第一个关键进程)。 - 本质:基于 Binder 机制的服务(类似 “远程服务中心”,应用通过 Binder 跨进程调用它的功能)。
- 定位:四大组件(Activity、Service、BroadcastReceiver、ContentProvider)的 “总调度员”,同时负责进程管理、应用崩溃处理、性能分析等。
为什么说它是 “大管家”?
- 组件管理:启动 / 销毁 Activity、Service,分发广播,管理 ContentProvider 的生命周期。
- 进程管理:监控所有应用进程,计算 “内存优先级分数(oom_score)”,配合 lmkd 进程在内存不足时杀进程。
- 系统协调:协调系统启动流程,发送关键阶段信号(如 “系统启动完成”),通知其他服务开始工作。
二、AMS 的启动过程:从 “出生” 到 “上岗”
AMS 的启动是 Android 系统启动的关键环节,贯穿 SystemServer 的启动流程(SystemServer 是启动所有系统服务的 “总控类”)。
1. 背景:SystemServer 的启动阶段
SystemServer 启动时会按顺序启动不同类型的服务:
-
bootstrap 服务(最高优先级,AMS 属于此类)→ core 服务 → other 服务 → apex 服务。
-
为了协调服务依赖,SystemServer 会发送 “阶段值(phase)”,例如:
PHASE_ACTIVITY_MANAGER_READY:AMS 准备就绪,其他服务可以调用它了。PHASE_BOOT_COMPLETED:系统完全启动,用户可以使用设备了。
2. AMS 启动的四个关键步骤
① 出生(创建实例)
在 SystemServer.startBootstrapServices() 中,AMS 被创建并初始化核心模块:
- 初始化进程管理模块
mProcessList、性能分析模块mAppProfiler、广播队列mFgBroadcastQueue等。 - 这些模块就像 AMS 的 “左右手”,各自负责专项任务。
② 设置系统进程(成为 “合法居民”)
在 setSystemProcess() 方法中:
- 注册到服务管理器:通过
ServiceManager.addService()将 AMS 注册为全局可访问的 Binder 服务(键为activity)。 - 记录自身进程信息:创建
ProcessRecord对象记录 systemserver 进程(包名设为android),并设置其oom_score为 -900(最高优先级,几乎不会被杀死)。 - 告知 lmkd 进程:通过
updateOomAdjLocked()发送进程优先级信息,确保系统关键进程不被误杀。
③ 准备(系统就绪,启动关键组件)
在 SystemServer.startOtherServices() 尾声,AMS 收到 systemReady() 通知:
- 通知模块就绪:告诉 ActivityTaskManager(ATMS)、进程管理模块等 “可以开工了”。
- 发送阶段信号:发送
PHASE_ACTIVITY_MANAGER_READY,告知其他服务 “AMS 已准备好,快来调用我”。 - 启动 Launcher:调用
mAtmInternal.startHomeOnAllDisplays()启动桌面应用,这是用户能使用设备的前提。
④ 等待启动动画完成(系统完全启动)
当 Launcher 启动完成后,AMS 发送 PHASE_BOOT_COMPLETED 信号:
- 标志 Android 系统完全启动,所有服务进入正式工作状态。
三、AMS 的 “小伙伴”:核心模块解析
AMS 不是 “单打独斗”,而是通过多个模块协作完成复杂任务:
1. Activity 管理模块
- 实际执行者:
ActivityTaskManagerService(ATMS)(单独的 Binder 服务,被 AMS 管理)。 - 作用:管理所有 Activity 的生命周期(启动、暂停、停止),用
ActivityRecord记录每个 Activity 的状态。
2. Service 管理模块
- 实际执行者:
ActiveServices类(非 Binder 服务,属于 AMS 内部模块)。 - 作用:管理 Service 的启动、绑定、销毁,用
ServiceRecord记录每个 Service。
3. BroadcastReceiver 管理模块
- 实际执行者:
BroadcastQueue类(分前台广播队列、后台广播队列等)。 - 作用:分发广播、管理接收器生命周期,用
BroadcastRecord记录广播任务。
4. ContentProvider 管理模块
- 实际执行者:
ContentProviderHelper类。 - 作用:管理 ContentProvider 的创建和访问,用
ContentProviderRecord记录提供者。
5. 进程管理模块
-
核心类:
ProcessList(记录进程信息)和OomAdjuster(计算进程优先级)。 -
工作逻辑:
ProcessList用ProcessRecord保存所有进程,向 Zygote 发送创建进程的请求。OomAdjuster计算每个进程的oom_score(分数越高越容易被杀),例如前台 Activity 进程分数为 0,后台进程分数更高。- 配合 lmkd 进程,在内存不足时按分数杀进程,释放资源。
6. App 错误管理模块
- 核心类:
AppErrors。 - 作用:处理应用崩溃(Crash)、ANR(无响应),收集堆栈信息并记录日志,便于问题分析。
7. App 性能分析模块
- 核心类:
AppProfiler。 - 作用:统计应用的 CPU、内存使用情况,为性能优化提供数据支持。
四、总结:AMS 为什么重要?
-
系统枢纽:连接应用层和系统层,几乎所有应用操作(启动 Activity、发送广播等)都要经过 AMS。
-
资源调度核心:管理进程优先级、内存分配,确保系统流畅运行。
-
名字的 “欺骗性” :虽然叫 “ActivityManager”,但实际是四大组件 + 进程 + 性能的 “全能管家”。
后续学习方向:可深入研究进程管理中的 OomAdjuster 算法、Activity 启动流程、ANR 监控机制等,这些都是 Android 性能优化的关键知识点。