AMS、WMS、PMS:系统核心服务解析

一、 系统的“三巨头”

        Android 的交互模式是:应用进程通过 Binder 请求 系统进程(system_server) 中的服务来完成工作。

        而 system_server 进程是一个庞大的容器,其中运行着数十个至关重要的系统服务,它们各司其职,共同维系着整个系统的运转。其中,ActivityManagerService (AMS)WindowManagerService (WMS) 和 PackageManagerService (PMS) 堪称这个容器中的“三巨头”,是 Android 框架层最核心、最复杂的服务。

        这里将深入解析这三大服务各自的职责、内部机制,以及它们如何精妙协同,完成诸如应用启动、界面显示等复杂任务。

二、 各司其职:三巨头的核心使命与内部机制

1. ActivityManagerService (AMS) - 应用的“总调度师”

  • 核心职责:管理四大组件(尤其是 Activity)的生命周期和调度,管理应用进程和任务栈(Task)。

  • 详细工作与内部机制

    • 前台进程 (FOREGROUND_APP_ADJ = 0): 正在与用户交互的进程。

    • 可见进程 (VISIBLE_APP_ADJ = 100): 如弹出一个非全屏的对话框。

    • 服务进程 (SERVICE_ADJ = 500): 持有正在运行的 Service。

    • 后台进程 (PREVIOUS_APP_ADJ = 700): 刚刚进入后台的进程。

    • 空进程 (CACHED_APP_MAX_ADJ = 900+): 为提升启动速度而保留的空进程。

    • ProcessRecord: 记录一个进程的信息(pid, uid, 进程名)。

    • ActivityRecord: 记录一个 Activity 的信息(它是哪个 ProcessRecord 的,位于哪个 TaskRecord)。

    • TaskRecord: 记录一个任务栈(一组相关的 Activity)。

    • ActivityStack: 管理这些任务栈的层次和状态(如全屏栈、分屏栈)。

    • 组件生命周期管理:所有 Activity 的 startresumepausestopdestroy 都是由 AMS 发出指令,应用进程再回调执行的。它是生命周期的“大脑”。它内部通过一系列 XXXRecord 类来记录状态:

    • 进程管理与调度(OOM_ADJ):维护所有应用进程的优先级列表,并依据系统内存状态和用户行为,通过 Low Memory Killer 机制来决定回收哪些进程。它通过计算 oom_adj 值来标识进程重要性(值越小越重要):

    • 跨进程通信枢纽:正如前篇所述,它是应用与系统、应用与应用间通信的核心中转站。

2. WindowManagerService (WMS) - 窗口的“大管家”

  • 核心职责:管理所有程序的窗口(Window),负责窗口的层次(Z-order)、位置、动画以及最终的绘制和显示。

  • 详细工作与内部机制

    • 窗口管理:每个 Activity 都对应一个顶层窗口。WMS 管理着所有窗口的添加、删除和调整顺序。PhoneWindow 和 DecorView 就是 WMS 与应用交互的桥梁。它内部通过 WindowTokenWindowState 等类来管理窗口状态和层级。

    • 输入事件分发InputManagerService 接收到的触摸(Touch)、按键(Key)等输入事件,最终会交由 WMS 来决策分发给哪个具体的窗口(View)来处理。WMS 是输入事件分发的起点。它通过计算窗口的层级和位置,找到最终接收事件的 WindowState

    • Surface 管理:WMS 负责为每个窗口分配一块图形缓冲区(Surface)。应用通过 SurfaceHolder 或 SurfaceView 获取这块 Surface,然后通过 Skia 或 OpenGL 向其上绘制内容来显示界面。WMS 最终将所有窗口的 Surface 交给 SurfaceFlinger 进行合成。

    • 动画管理:窗口切换、Activity 跳转等动画都是由 WMS 统一协调和渲染的,保证了视觉的流畅和一致。它使用 WindowAnimator 来管理所有这些动画。

3. PackageManagerService (PMS) - 应用的“安检与档案员”

  • 核心职责:管理所有应用的安装、卸载、更新和数据包信息解析。

  • 详细工作与内部机制

    • 解析 AndroidManifest.xml:在应用安装或扫描时,PMS 会解析 APK 文件(本质是zip包)中的 AndroidManifest.xml,提取出其中的四大组件、权限、包名、版本等信息,并持久化存储到 /data/system/packages.xml 和 packages.list 中。

    • 权限管理:维护着所有应用的权限授予状态。当应用调用需要权限的 API 时,对应的系统服务(如 AMS)会向 PMS 查询该应用是否已获得相应权限。权限信息也存储在 packages.xml 中。

    • 应用安装与优化:执行安装流程,包括:

    • 提供应用信息:为系统其他组件(如 Launcher、设置)提供已安装应用列表和信息查询接口。

    1. 拷贝 APK 文件到 /data/app/ 目录。

    2. 解压 classes.dex

    3. 使用 dex2oat 工具将 dex 文件编译优化成 OAT(一种ELF格式)文件,存放在 /data/dalvik-cache/ 中,以大幅提升应用启动和运行速度。

三、 协同作战:一次点击启动应用的全流程剖析

        现在,让我们将“三巨头”和之前的知识串联起来,看看当用户点击桌面图标时,它们是如何协同工作的。这个过程远比我们第二篇中描述的更精细,下图揭示了三大核心服务在其中扮演的角色与复杂的交互过程:

阶段一:决策与校验(AMS 主导,PMS 协助)

  1. Launcher 通过 Binder 调用 AMS.startActivity()

  2. AMS 收到请求后,首先求助 PMSPMS.resolveIntent()。PMS 根据 Intent 中的信息(如包名、类名),去它维护的数据库中查找,确定要启动的具体 Activity 是谁,并返回其信息(ActivityInfo)。

  3. AMS 继续请求 PMS 进行权限检查,确认 Launcher 是否有权启动这个应用。

  4. AMS 执行一系列前置工作:决定任务栈(Task),检查目标进程是否存在等,然后通知 Launcher 进入 onPause 状态。

阶段二:进程创建与初始化(AMS 主导)

  1. 如果目标进程不存在,AMS 请求 Zygote  fork 出新应用进程。

  2. 新进程启动,初始化 ActivityThread,并立即 attach 到 AMSAMS.attachApplication)。

  3. AMS 得知新进程就绪后,将之前保存的待启动 Activity 信息通过 Binder 发送给新进程,调用 ApplicationThread.scheduleLaunchActivity()。(注意:ApplicationThread 是应用进程提供给 AMS 的 Binder 钩子,用于接收 AMS 的指令)。

阶段三:界面创建与显示(应用进程与 WMS 协同)

  1. 应用进程的主线程(UI 线程)收到 AMS 的指令后,通过 Instrumentation 创建目标 Activity 实例,并回调 onCreate() 和 onStart()

  2. 在 onCreate() 中,我们通常会调用 setContentView()。这会创建应用的视图树(View Hierarchy),但其顶层容器 DecorView 此时还未被添加到窗口管理器。

  3. 当执行到 onResume() 之后,应用进程的视图树已经准备就绪。此时,应用进程会通过 WindowManager 的全局实例,向 WMS 发起一个跨进程调用:WMS.addWindow(decorView, windowParams)

  4. WMS 收到请求后:

    • 为这个 Activity 创建一个对应的 WindowState 对象来管理其状态。

    • 根据窗口参数(如宽高、类型)为其分配一块 Surface

    • 计算其在整个屏幕中的层次(Z-order)和位置。

  5. WMS 将 Surface 信息返回给应用进程。应用进程的 ViewRootImpl 会获取到这个 Surface,并开始绘制流程(measure -> layout -> draw)。

  6. 绘制的内容(像素点)通过 Surface 直接写入图形缓冲区。WMS 将所有窗口的 Surface 信息发送给 SurfaceFlinger 进行最终合成,并显示到屏幕上。

至此,一个应用界面才完整地呈现给用户。整个过程涉及多个进程、多次 Binder 调用,但在三大核心服务的精密协同下,变得高效而有序。

四、 总结与洞察

通过剖析三大服务,我们可以得到以下更深层次的洞察:

  • 分层与抽象:Android 系统设计是高度分层和抽象的。AMS 关注“做什么”(调度),WMS 关注“怎么显示”(渲染),PMS 关注“你是谁”(元数据)。这种解耦使得系统更易于维护和扩展。

  • 控制权反转(IoC):应用的生命周期并不掌握在自己手中,而是由 AMS 控制。这是一种典型控制权反转设计,保证了系统的统一管控。

  • 性能与安全:WMS 统一管理 Surface 和输入事件,是从系统层面保证流畅体验和安全性的关键(例如防止输入事件被窃取)。

理解了 AMS、WMS、PMS 的协同,你就真正理解了 Android 系统运行的核心机制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值