ActivityManagerService (AMS) 是系统最核心的服务之一,运行在 system_server 进程。可以把它理解为 Android 系统的“大总管”,负责统一调度所有应用组件(Activity、Service、BroadcastReceiver、ContentProvider)的生命周期,并管理应用进程与系统内存。
AMS与ATMS
- AMS (ActivityManagerService) :负责进程创建、生命周期、内存管理。
- ATMS (ActivityTaskManagerService) :负责 Activity 栈管理。维护所有
TaskRecord和ActivityRecord,处理启动、切换等逻辑。
AMS 的启动流程
AMS 在系统启动早期由 SystemServer 进程创建并初始化,主要步骤:
- 入口:
SystemServer的main()方法,创建SystemServer实例并调用run()。在run()方法中调用startBootstrapServices()方法。 - 创建:通过
SystemServiceManager的startService()方法,传入ActivityManagerService.Lifecycle.class,反射创建Lifecycle实例时,其构造函数会同步创建 AMS 实例。 - 启动:
Lifecycle的onStart()方法调用AMS.start(),服务正式启动。 - 后续:AMS 启动后,会进一步调用
setSystemProcess()等方法完成初始化,并创建和绑定 ATMS。在稍后的startOtherServices()阶段,系统会调用installSystemProviders()方法,为system_server进程自身安装必要的ContentProvider,完成系统环境的最后准备。
核心数据结构
AMS通过几个核心数据结构精确掌握系统状态:
ProcessRecord:进程的“档案”。记录 PID、UID、进程名、oom_adj(优先级)及该进程中运行的所有ActivityRecord和ServiceRecord。ActivityRecord:Activity 的“身份证”。记录ComponentName、Intent、状态等。TaskRecord:任务栈的“容器”。一组ActivityRecord的集合,遵循后进先出(LIFO)。ActivityStack:堆栈“管理员”。管理多个TaskRecord,处理入栈出栈。
进程管理:LRU列表与OOM机制
-
LRU列表 (
mLruProcesses) :存储所有ProcessRecord。列表逻辑上分为三段:有Activity的进程、有Service的进程、其他进程。updateLruProcessLocked()方法负责动态调整进程在列表中的位置。 -
OOM调整值 (
oom_adj) :这是进程被LMK(Low Memory Killer)杀死的直接依据。- 计算与设置:AMS的
ProcessList类实时计算该值,并通过Process.setOomAdj()设置给Linux内核。 - 取值范围:数值越小,优先级越高。例如前台进程约
-1000 ~ -200,空进程在200+。 - “木桶效应” :进程的
oom_adj由其中优先级最高的活跃组件决定。
- 计算与设置:AMS的
四大组件调度与权限管理
除了 Activity,AMS 还管理着其他三大组件。
- BroadcastReceiver 管理:AMS 持有所有广播接收者的集合。处理广播时会进行双重权限检查,匹配成功的 Receiver 会通过
ApplicationThread回调onReceive。 - Service 管理:通过
startService或bindService发起请求,AMS 检查权限后,或创建新进程,或直接调度已有进程执行生命周期回调。 - ContentProvider 管理:作为跨进程数据共享的枢纽,负责注册、权限校验及进程间的 Binder 对象传递。
典型工作流程:Activity 启动
应用通过 ActivityManager 代理发起 startActivity() 请求,通过 Binder 跨进程通信传给 system_server 的 AMS。AMS 与 ATMS 协作处理任务栈,若目标进程未启动,则通过 Socket 向 Zygote 请求创建新进程,最后在新进程里完成 Activity 的创建和生命周期回调。