android12 ActivityManagerService

7 阅读3分钟

ActivityManagerService (AMS) 是系统最核心的服务之一,运行在 system_server 进程。可以把它理解为 Android 系统的“大总管”,负责统一调度所有应用组件(Activity、Service、BroadcastReceiver、ContentProvider)的生命周期,并管理应用进程与系统内存。

AMS与ATMS

  • AMS (ActivityManagerService) :负责进程创建、生命周期、内存管理
  • ATMS (ActivityTaskManagerService) :负责 Activity 栈管理。维护所有 TaskRecord 和 ActivityRecord,处理启动、切换等逻辑

AMS 的启动流程

AMS 在系统启动早期由 SystemServer 进程创建并初始化,主要步骤:

  1. 入口SystemServer 的 main() 方法,创建SystemServer实例并调用run()。在run()方法中调用startBootstrapServices()方法。
  2. 创建:通过 SystemServiceManager 的 startService() 方法,传入 ActivityManagerService.Lifecycle.class,反射创建 Lifecycle 实例时,其构造函数会同步创建 AMS 实例。
  3. 启动Lifecycle 的 onStart() 方法调用 AMS.start(),服务正式启动。
  4. 后续:AMS 启动后,会进一步调用 setSystemProcess() 等方法完成初始化,并创建和绑定 ATMS。在稍后的 startOtherServices() 阶段,系统会调用installSystemProviders()方法,为 system_server 进程自身安装必要的 ContentProvider,完成系统环境的最后准备。

核心数据结构

AMS通过几个核心数据结构精确掌握系统状态:

  • ProcessRecord:进程的“档案”。记录 PID、UID、进程名、oom_adj(优先级)及该进程中运行的所有 ActivityRecord 和 ServiceRecord
  • ActivityRecord:Activity 的“身份证”。记录 ComponentNameIntent、状态等。
  • 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由其中优先级最高的活跃组件决定。

四大组件调度与权限管理

除了 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 的创建和生命周期回调。