7、SystemServer核心服务:AMS、WMS、PMS等核心服务启动流程与职责

SystemServer,这个名字你肯定不陌生。它是Android系统的“大管家”,几乎所有你叫得上名字的核心服务——ActivityManagerService、WindowManagerService、PackageManagerService——都在这里启动。说白了,SystemServer就是整个Android框架的发动机。

我个人习惯把SystemServer的启动过程看作一场精心编排的交响乐。每个服务都有自己登场的时机,早了不行,晚了系统就卡住。今天我们就来拆解一下,这几个核心服务到底是怎么启动的,它们又各自扛着什么职责。

7.1 SystemServer的启动入口

SystemServer本身是一个Java进程,由Zygote孵化而来。入口在SystemServer.main()方法里。嗯,这里要注意,它并不是一股脑把所有服务都new出来,而是分阶段进行的。

// 伪代码示意
public static void main(String[] args) {
    new SystemServer().run();
}

private void run() {
    // 1. 准备主线程Looper
    Looper.prepareMainLooper();

    // 2. 加载本地库
    System.loadLibrary("android_servers");

    // 3. 创建系统上下文
    createSystemContext();

    // 4. 分阶段启动服务
    startBootstrapServices();   // 引导服务
    startCoreServices();        // 核心服务
    startOtherServices();       // 其他服务

    // 5. 进入消息循环
    Looper.loop();
}

你看,它分成了三个启动阶段。为什么这么分?因为服务之间有依赖关系。比如WMS需要用到PMS提供的包信息,AMS又需要WMS来管理窗口焦点。所以必须按依赖链来排顺序。

关键点:SystemServer的启动顺序不是随意的,而是严格按照依赖关系设计的。引导服务最先启动,然后是核心服务,最后才是其他服务。

7.2 AMS:ActivityManagerService

AMS是Android系统中最重要的服务之一,没有它,你的App连启动都做不到。它负责管理四大组件的生命周期、进程调度、任务栈管理、权限检查等等。

7.2.1 AMS的启动流程

AMS在startBootstrapServices()阶段启动。为什么这么早?因为后续很多服务都需要AMS来管理进程。

// SystemServer.java
private void startBootstrapServices() {
    // 安装系统服务
    ActivityTaskManagerService atm = mSystemServiceManager.startService(
            ActivityTaskManagerService.Lifecycle.class);
    mActivityManagerService = ActivityManagerService.Lifecycle.startService(
            mSystemServiceManager, atm);
    // 设置系统进程
    mActivityManagerService.setSystemProcess();
}

AMS启动后,会做几件重要的事:

  • 创建ProcessRecord来管理系统进程
  • 初始化IntentResolver用于解析Intent
  • 注册系统广播接收器
  • 启动Watchdog监控系统健康
避坑指南:我曾经在定制系统时,因为修改了AMS的启动顺序,导致WMS拿不到正确的进程信息,结果窗口一直显示黑屏。后来花了整整两天才定位到问题。所以,千万别轻易动启动顺序。

7.2.2 AMS的核心职责

职责 说明
组件管理 管理Activity、Service、BroadcastReceiver、ContentProvider的生命周期
进程管理 维护进程优先级,决定何时杀进程回收内存
任务栈管理 管理Activity的返回栈、启动模式(standard、singleTop等)
权限检查 检查App是否有权限执行某些操作

7.3 WMS:WindowManagerService

WMS负责管理窗口。你看到的每一个界面元素——状态栏、导航栏、App的Activity窗口——都由WMS统一调度。它决定了哪个窗口在最上面,哪个窗口该获得焦点。

7.3.1 WMS的启动流程

WMS在startCoreServices()阶段启动。为什么比AMS晚?因为WMS需要AMS已经就绪,才能处理窗口焦点和输入事件的分发。

// SystemServer.java
private void startCoreServices() {
    // 启动WMS
    wm = WindowManagerService.main(context, inputManager,
            mActivityManagerService.mWindowManager,
            mActivityManagerService.mDisplayManager,
            mActivityManagerService.mPolicy);
    ServiceManager.addService(Context.WINDOW_SERVICE, wm);
}

WMS启动时,会做这些事:

  • 创建WindowManagerPolicy,用于处理窗口策略(比如锁屏、横竖屏切换)
  • 初始化DisplayContent,管理多屏显示
  • 启动InputManager,开始监听输入事件
注意:WMS和AMS之间有很多交互。比如AMS要启动一个Activity时,会通过WMS来创建对应的窗口。如果WMS启动慢了,AMS就会一直等待,导致系统启动卡住。

7.3.2 WMS的核心职责

职责 说明
窗口管理 管理窗口的添加、移除、大小、位置、层级
输入事件分发 将触摸、按键事件分发给正确的窗口
动画管理 管理窗口切换动画、启动动画
屏幕旋转 处理横竖屏切换时的窗口布局调整

7.4 PMS:PackageManagerService

PMS负责管理所有已安装的APK。它维护着包名、权限、组件信息、签名等数据。你安装一个App时,PMS会解析APK,提取出AndroidManifest.xml中的信息,然后存到数据库中。

7.4.1 PMS的启动流程

PMS也在startCoreServices()阶段启动。它启动时要做的事情非常多,因为需要扫描所有已安装的APK。

// SystemServer.java
private void startCoreServices() {
    // 启动PMS
    PackageManagerService pms = new PackageManagerService(context,
            mActivityManagerService.mPackageManager,
            mActivityManagerService.mInstaller);
    ServiceManager.addService("package", pms);
}

PMS的构造函数里,会做这些事:

  • 扫描/system/app/data/app等目录下的APK
  • 解析每个APK的AndroidManifest.xml
  • 建立包名到组件信息的映射
  • 检查签名一致性
  • 更新权限数据库
个人经验:我记得有一次在低端设备上做系统优化,发现PMS启动耗时占了整个SystemServer启动时间的40%。后来通过延迟扫描第三方App、使用缓存机制,把启动时间缩短了一半。你想想看,如果设备上有几百个App,PMS一个个解析,那得多慢。

7.4.2 PMS的核心职责

职责 说明
包管理 安装、卸载、更新APK
组件解析 根据Intent查找匹配的Activity、Service等组件
权限管理 管理App的权限声明和授予
签名验证 验证APK签名的合法性,防止恶意篡改

7.5 核心服务之间的协作关系

这三个服务不是孤立的。它们之间有很多交互。举个例子:

  • 用户点击桌面图标 → Launcher通过AMS启动Activity
  • AMS查询PMS,找到对应的Activity信息
  • AMS通知WMS创建窗口
  • WMS分配窗口层级,显示到屏幕上

你看,一个简单的点击操作,背后是三个核心服务的协同工作。

核心思想:AMS管组件生命周期,WMS管窗口显示,PMS管包信息。三者各司其职,又紧密配合。

7.6 核心服务启动流程图

下面这张图展示了SystemServer启动过程中,AMS、WMS、PMS的启动顺序和依赖关系。

SystemServer核心服务启动流程 SystemServer.main() 阶段1: startBootstrapServices() AMS启动 (ActivityManagerService) 阶段2: startCoreServices() WMS启动 (WindowManagerService) PMS启动 (PackageManagerService) 其他核心服务 依赖关系: AMS → WMS/PMS (AMS先启动,WMS和PMS依赖AMS)

7.7 总结

SystemServer的核心服务启动,说白了就是一场依赖链的编排。AMS最先登场,因为它要管进程和组件;WMS和PMS紧随其后,一个管窗口,一个管包信息。这三个服务一旦就绪,Android系统的基本骨架就搭起来了。

我在实际项目中遇到过一个问题:某次系统升级后,第三方App启动时总是闪退。排查了半天,发现是PMS在扫描APK时,因为签名缓存没更新,导致AMS拿到的组件信息是旧的。你看,一个缓存问题就能引发连锁反应。

所以,理解这些核心服务的启动流程和职责,不仅仅是应付面试。它能在你遇到系统级Bug时,帮你快速定位问题根源。嗯,这就是我今天想分享的内容。

一句话总结:SystemServer的启动,就是AMS、WMS、PMS按依赖关系依次登场,各司其职,共同撑起Android系统的运行框架。

公众号:蓝海资料掘金营,微信deep3321