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
是一個多線程進程,不同的服務運行在不同的線程中:
- AMS →
ActivityManager
線程 - WMS →
WindowManager
線程 - PMS →
PackageManager
線程
它們通過 Binder 線程池(如 Binder:XXX_1
)與 App 進程通信。
(3)system_server 還有哪些關鍵線程?
除了 AMS/WMS/PMS,system_server
還包含許多重要線程:
線程名 | 作用 |
---|---|
main | SystemServer 主線程,負責啟動其他服務 |
android.fg | 處理前臺任務(如廣播、ANR 監測) |
android.ui | 處理 UI 相關任務(如 Input 事件) |
android.io | 管理 I/O 操作(如文件讀寫) |
Binder:XXX_N | Binder 線程池,處理跨進程調用 |
示例:當 App 調用 startActivity()
時:
- App 進程通過 Binder 調用
system_server
的ActivityManager
線程。 - AMS 處理請求后,可能再通過 WMS 的
WindowManager
線程管理窗口。
4. 為什么這樣設計?—— 多線程 vs 多進程
你可能會有疑問:為什么不把 AMS、WMS、PMS 拆分成獨立進程?
(1)性能考量
- 減少進程間通信(IPC)開銷:如果 AMS/WMS/PMS 是獨立進程,每次調用都需要 Binder 通信,而 Binder 是同步阻塞的,頻繁 IPC 會降低性能。
- 共享內存優化:同進程內數據共享更快(如
ActivityRecord
、WindowState
等數據結構)。
(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. 總結
- AMS/WMS/PMS 是 Android 最核心的三大系統服務,分別管理應用、窗口和包。
- 它們運行在
system_server
進程的不同線程,而非獨立進程,以減少 IPC 開銷。 system_server
是一個多線程進程,包含主線程、Binder 線程、AMS/WMS/PMS 專屬線程等。- 這樣設計的優勢:性能高、協作方便、穩定性強。
如果你是 Android 開發者,理解 system_server
的架構,能幫助你更深入地掌握 Framework 層的工作原理,尤其是在分析 ANR、UI 卡頓、Binder 通信等問題時。
7. 擴展思考
- 如果 AMS 的線程卡死,會影響 WMS 嗎?(答案:會,因為它們同屬
system_server
進程!) - 為什么
SurfaceFlinger
不在system_server
里?(答案:因為它需要獨立的 GPU 訪問權限,且歷史原因。) - 如何優化
system_server
的負載?(答案:減少跨進程調用、避免主線程阻塞。)