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.pswp.cn/news/905955.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905955.shtml
英文地址,請注明出處:http://en.pswp.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…