当前位置: 首页 > ds >正文

Android核心系统服务:AMS、WMS、PMS 与 system_server 进程解析

1. 引言

在 Android 系统中,ActivityManagerService (AMS)WindowManagerService (WMS)PackageManagerService (PMS) 是三个最核心的系统服务,它们分别管理着应用的生命周期、窗口显示和应用包管理。

但你是否知道,这些服务并不是独立进程,而是运行在同一个系统进程——system_server 中?本文将介绍 AMS/WMS/PMS 的核心作用,并深入探讨 system_server 进程的架构,包括它的线程模型和关键组件。


2. AMS、WMS、PMS 的作用

(1)ActivityManagerService (AMS) —— 应用生命周期管理者

AMS 是 Android 的“大管家”,负责:

  • 启动/管理 Activity(如 startActivity() 的底层实现)
  • 管理应用进程(通过 ProcessList 分配进程优先级)
  • 处理 ANR(Application Not Responding)
  • 管理任务栈(TaskStack)(决定 Activity 如何回退)

举例:当你点击一个 App 图标时,AMS 会检查目标 Activity 是否存在,并决定是否创建新进程或复用已有进程。

(2)WindowManagerService (WMS) —— 窗口管理者

WMS 负责所有 UI 窗口的显示与交互:

  • 管理窗口层级(Window层级,如 Dialog、Toast、StatusBar)
  • 处理触摸事件分发(决定哪个窗口接收事件)
  • 与 SurfaceFlinger 协作(控制 Surface 的合成与渲染)

举例:当你滑动屏幕时,WMS 会计算触摸事件应该分发给哪个 App 的哪个窗口。

(3)PackageManagerService (PMS) —— 包管理专家

PMS 管理所有 APK 的安装、卸载和权限:

  • 解析 AndroidManifest.xml(获取四大组件信息)
  • 管理应用权限(如运行时权限 checkSelfPermission()
  • 处理 APK 安装/卸载(调用 installd 守护进程)

举例:当你安装一个 App 时,PMS 会校验签名、分配 UID,并更新 /data/system/packages.xml


3. system_server 进程:Android 系统服务的“大本营”

AMS、WMS、PMS 并不是独立进程,而是运行在 system_server 进程中的不同线程

(1)system_server 是什么?

  • Zygote 进程孵化(Android 所有进程的父进程)。
  • 在系统启动时初始化,运行几乎所有核心系统服务。
  • 通过 Binder IPC 向 App 进程提供跨进程调用(如 IActivityManager)。

(2)AMS/WMS/PMS 是 system_server 的线程吗?

是的!system_server 是一个多线程进程,不同的服务运行在不同的线程中:

  • AMSActivityManager 线程
  • WMSWindowManager 线程
  • PMSPackageManager 线程

它们通过 Binder 线程池(如 Binder:XXX_1)与 App 进程通信。

(3)system_server 还有哪些关键线程?

除了 AMS/WMS/PMS,system_server 还包含许多重要线程:

线程名作用
mainSystemServer 主线程,负责启动其他服务
android.fg处理前台任务(如广播、ANR 监测)
android.ui处理 UI 相关任务(如 Input 事件)
android.io管理 I/O 操作(如文件读写)
Binder:XXX_NBinder 线程池,处理跨进程调用

示例:当 App 调用 startActivity() 时:

  1. App 进程通过 Binder 调用 system_serverActivityManager 线程。
  2. AMS 处理请求后,可能再通过 WMS 的 WindowManager 线程管理窗口。

4. 为什么这样设计?—— 多线程 vs 多进程

你可能会有疑问:为什么不把 AMS、WMS、PMS 拆分成独立进程?

(1)性能考量

  • 减少进程间通信(IPC)开销:如果 AMS/WMS/PMS 是独立进程,每次调用都需要 Binder 通信,而 Binder 是同步阻塞的,频繁 IPC 会降低性能。
  • 共享内存优化:同进程内数据共享更快(如 ActivityRecordWindowState 等数据结构)。

(2)稳定性与依赖管理

  • AMS/WMS/PMS 之间需要紧密协作(如启动 Activity 需要 AMS 和 WMS 配合)。
  • 如果某个服务崩溃,整个 system_server 会重启(而不是单个服务崩溃导致系统不稳定)。

(3)历史演进

  • 早期 Android 确实尝试过让部分服务独立(如 SurfaceFlinger),但后来发现 IPC 开销太大,最终大多数核心服务合并到 system_server

5. 如何观察 system_server 的线程?

我们可以通过以下命令查看 system_server 的线程情况:

# 查看 system_server 进程ID
adb shell ps -A | grep system_server# 查看该进程的所有线程
adb shell ps -T <PID># 或者用 top 看 CPU 占用
adb shell top -H -p <PID>

典型输出示例

USER      PID   PPID  TID   CMD  
system    1234  1     1234  system_server  
system    1234  1     1235  Binder:1234_1  
system    1234  1     1236  ActivityManager  
system    1234  1     1237  WindowManager  
system    1234  1     1238  PackageManager  

6. 总结

  1. AMS/WMS/PMS 是 Android 最核心的三大系统服务,分别管理应用、窗口和包。
  2. 它们运行在 system_server 进程的不同线程,而非独立进程,以减少 IPC 开销。
  3. system_server 是一个多线程进程,包含主线程、Binder 线程、AMS/WMS/PMS 专属线程等。
  4. 这样设计的优势:性能高、协作方便、稳定性强。

如果你是 Android 开发者,理解 system_server 的架构,能帮助你更深入地掌握 Framework 层的工作原理,尤其是在分析 ANR、UI 卡顿、Binder 通信等问题时。


7. 扩展思考

  • 如果 AMS 的线程卡死,会影响 WMS 吗?(答案:会,因为它们同属 system_server 进程!)
  • 为什么 SurfaceFlinger 不在 system_server 里?(答案:因为它需要独立的 GPU 访问权限,且历史原因。)
  • 如何优化 system_server 的负载?(答案:减少跨进程调用、避免主线程阻塞。)
http://www.xdnf.cn/news/6964.html

相关文章:

  • cursor/vscode启动项目connect ETIMEDOUT 127.0.0.1:xx
  • 鸿蒙ArkUI体验:Hexo博客客户端开发心得
  • JVM 调优实战入门:从 GC 日志分析到参数调优
  • 基于requests_html的python爬虫
  • Redis——缓存雪崩、击穿、穿透
  • 内容安全:使用开源框架Caffe实现上传图片进行敏感内容识别
  • HMDB51数据集划分
  • V 型不锈钢对夹球阀:高性价比流体控制的优选方案-耀圣
  • 联想笔记本黑屏了,排线出问题还是静电
  • QT调用Halcon查询所有摄像头名称
  • 遨游科普:三防平板是什么?有什么功能?
  • Linux安全篇 --firewalld
  • Windows系统永久暂停更新操作步骤
  • 微软家各种copilot的AI产品:Github copilot、Microsoft copilot
  • 什么是PMBus
  • 18-总线IIC
  • 大模型在腰椎间盘突出症预测与治疗方案制定中的应用研究
  • LeetCode 热题 100_寻找重复数(100_287_中等_C++)(技巧)(暴力解法;哈希集合;二分查找)
  • 字节2025实习/校招/社招 内推码:R9SZ7Y1
  • 车载以太网驱动智能化:域控架构设计与开发实践
  • 【Ubuntu】Waydroid-Linux安卓模拟器安装
  • 【数据结构】线性表--队列
  • 自动化脚本开发:Python调用云手机API实现TikTok批量内容发布
  • 卷积神经网络中的二维卷积与三维卷积详解
  • 山东大学计算机图形学期末复习10——CG12下
  • Redis设计与实现——分布式Redis
  • 共享内存【Linux操作系统】
  • Go语言语法---输入控制
  • Node.js 源码架构详解
  • [system-design] ByteByteGo_Note Summary