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.mzph.cn/news/905955.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从另一个视角理解TCP握手、挥手与可靠传输

本文将深入探讨 TCP 协议中三次握手、四次挥手的原理&#xff0c;以及其保证可靠传输的机制。 一、三次握手&#xff1a;为何是三次&#xff0c;而非两次&#xff1f; 建立 TCP 连接的过程犹如一场严谨的 “对话”&#xff0c;需要经过三次握手才能确保通信双方的可靠连接。 三…

将Docker compose 部署的夜莺V6版本升到V7版本的详细步骤、常见问题解答及相关镜像下载地址

环境说明 夜莺官网&#xff1a;首页 - 快猫星云Flashcat 夜莺安装程序下载地址&#xff1a;快猫星云下载中心 夜莺v7.7.2镜像&#xff08;X86架构&#xff09;&#xff1a; https://download.csdn.net/download/jjk_02027/90851161 夜莺ibex v1.2.0镜像&#xff08;X86架构…

JavaScript【4】数组和其他内置对象(API)

1.数组: 1.概述: js中数组可理解为一个存储数据的容器,但与java中的数组不太一样;js中的数组更像java中的集合,因为此集合在创建的时候,不需要定义数组长度,它可以实现动态扩容;js中的数组存储元素时,可以存储任意类型的元素,而java中的数组一旦创建后,就只能存储定义类型的元…

永久免费!专为 Apache Doris 打造的可视化数据管理工具 SelectDB Studio V1.1.0 重磅发布!

作为全球领先的开源实时数据仓库&#xff0c; Apache Doris Github Stars 已超过 13.6k&#xff0c;并在 5000 余家中大型企业生产环境得到广泛应用&#xff0c;支撑业务核心场景&#xff0c;成为众多企业数据分析基础设施不可或缺的重要基座。过去&#xff0c;Apache Doris 用…

数字万用表与指针万用表使用方法及注意事项

在电子测量领域&#xff0c;万用表是极为常用的工具&#xff0c;数字万用表和指针万用表各具特点。熟练掌握它们的使用方法与注意事项&#xff0c;能确保测量的准确性与安全性。下面为您详细介绍&#xff1a; 一 、数字万用表按钮功能 > 进入及退出手动量程模式 每 按 […

深度学习Dropout实现

深度学习中的 Dropout 技术在代码层面上的实现通常非常直接。其核心思想是在训练过程中&#xff0c;对于网络中的每个神经元&#xff08;或者更精确地说&#xff0c;是每个神经元的输出&#xff09;&#xff0c;以一定的概率 p 随机将其输出置为 0。在反向传播时&#xff0c;这…

AtCoder AT_abc406_c [ABC406C] ~

前言 除了 A 题&#xff0c;唯一一道一遍过的题。 题目大意 我们定义满足以下所有条件的一个长度为 N N N 的序列 A ( A 1 , A 2 , … , A N ) A(A_1,A_2,\dots,A_N) A(A1​,A2​,…,AN​) 为波浪序列&#xff1a; N ≥ 4 N\ge4 N≥4&#xff08;其实满足后面就必须满足这…

Java Web 应用安全响应头配置全解析:从单体到微服务网关的实践

背景&#xff1a;为什么安全响应头至关重要&#xff1f; 在 Web 安全领域&#xff0c;响应头&#xff08;Response Headers&#xff09;是防御 XSS、点击劫持、跨域数据泄露等攻击的第一道防线。通过合理配置响应头&#xff0c;可强制浏览器遵循安全策略&#xff0c;限制恶意行…

如何停止终端呢?ctrl+c不管用,其他有什么方法呢?

如果你在终端中运行了一个程序&#xff08;比如 Python GUI tkinter 应用&#xff09;&#xff0c;按下 Ctrl C 没有作用&#xff0c;一般是因为该程序&#xff1a; 运行了主事件循环&#xff08;例如 tkinter.mainloop()&#xff09; 或 在子线程中运行&#xff0c;而 Ctrl …

深入解析 React 的 useEffect:从入门到实战

文章目录 前言一、为什么需要 useEffect&#xff1f;核心作用&#xff1a; 二、useEffect 的基础用法1. 基本语法2. 依赖项数组的作用 三、依赖项数组演示1. 空数组 []&#xff1a;2.无依赖项&#xff08;空&#xff09;3.有依赖项 四、清理副作用函数实战案例演示1. 清除定时器…

Ubuntu 更改 Nginx 版本

将 1.25 降为 1.18 先卸载干净 # 1. 完全卸载当前Nginx sudo apt purge nginx nginx-common nginx-core# 2. 清理残留配置 sudo apt autoremove sudo rm -rf /etc/apt/sources.list.d/nginx*.list修改仓库地址 # 添加仓库&#xff08;通用稳定版仓库&#xff09; codename$(…

如何在 Windows 10 或 11 中安装 PowerShellGet 模块?

PowerShell 是微软在其 Windows 操作系统上提供的强大脚本语言,可用于通过命令行界面自动化各种任务,适用于 Windows 桌面或服务器环境。而 PowerShellGet 是 PowerShell 中的一个模块,提供了用于从各种来源发现、安装、更新和发布模块的 cmdlet。 本文将介绍如何在 PowerS…

NBA足球赛事直播源码体育直播M33模板赛事源码

源码名称&#xff1a;体育直播赛事扁平自适应M33直播模板源码 开发环境&#xff1a;帝国cms7.5 空间支持&#xff1a;phpmysql 带软件采集&#xff0c;可以挂着自动采集发布&#xff0c;无需人工操作&#xff01; 演示地址&#xff1a;NBA足球赛事直播源码体育直播M33模板赛事…

【Python】魔法方法是真的魔法! (第二期)

还不清楚魔术方法&#xff1f; 可以看看本系列开篇&#xff1a;【Python】小子&#xff01;是魔术方法&#xff01;-CSDN博客 【Python】魔法方法是真的魔法&#xff01; &#xff08;第一期&#xff09;-CSDN博客 在 Python 中&#xff0c;如何自定义数据结构的比较逻辑&…

Qt 强大的窗口停靠浮动

1、左边&#xff1a; 示例代码&#xff1a; CDockManager::setConfigFlags(CDockManager::DefaultOpaqueConfig); CDockManager::setConfigFlag(CDockManager::FocusHighlighting, true); dockManager new CDockManager(this); // Disabling the Internal Style S…

Linux进程异常退出排查指南

在 Linux 中&#xff0c;如果进程无法正常终止&#xff08;如 kill 命令无效&#xff09;或异常退出&#xff0c;可以按照以下步骤排查和解决&#xff1a; 1. 常规终止进程 尝试普通终止&#xff08;SIGTERM&#xff09; kill PID # 发送 SIGTERM 信号&#xff08;…

使用tensorRT10部署低光照补偿模型

1.低光照补偿模型的简单介绍 作者介绍一种Zero-Reference Deep Curve Estimation (Zero-DCE)的方法用于在没有参考图像的情况下增强低光照图像的效果。 具体来说&#xff0c;它将低光照图像增强问题转化为通过深度网络进行图像特定曲线估计的任务。训练了一个轻量级的深度网络…

SLAM定位常用地图对比示例

序号 地图类型 概述 1 格栅地图 将现实环境栅格化,每一个栅格用 0 和 1 分别表示空闲和占据状态,初始化为未知状态 0.5 2 特征地图 以点、线、面等几何特征来描绘周围环境,将采集的信息进行筛选和提取得到关键几何特征 3 拓扑地图 将重要部分抽象为地图,使用简单的图形表示…

【图像生成1】Latent Diffusion Models 论文学习笔记

一、背景 本文主要记录一下使用 LDMs 之前&#xff0c;学习 LDMs 的过程。 二、论文解读 Paper&#xff1a;[2112.10752] High-Resolution Image Synthesis with Latent Diffusion Models 1. 总体描述 LDMs 将传统 DMs 在高维图像像素空间&#xff08;Pixel Space&#x…

通信安全堡垒:profinet转ethernet ip主网关提升冶炼安全与连接

作为钢铁冶炼生产线的安全检查员&#xff0c;我在此提交关于使用profinet转ethernetip网关前后对生产线连接及安全影响的检查报告。 使用profinet转ethernetip网关前的情况&#xff1a; 在未使用profinet转ethernetip网关之前&#xff0c;我们的EtherNet/IP测温仪和流量计与PR…