這個階段從按下電源鍵開始,直到 Linux 核心準備好進入使用者空間。
boot.img
載入到 RAM。boot.img
包含了 Linux 核心 (Kernel) 和一個 根檔案系統 (Ramdisk)。init
程序。init
程序:這是從核心空間轉向使用者空間的關鍵一步。核心執行 Ramdisk 中的 init
程序,其 PID 永遠為 1。自此,所有後續的程序都將由 init
直接或間接啟動。這個階段的核心是 init
程序,它負責啟動所有 Android 系統所需的核心服務。
init
程序:所有程序的始祖.rc
檔案:init
程序會讀取位於根目錄的 init.rc
和相關的 .rc
腳本檔案。這些檔案就像一份啟動清單,定義了系統啟動時需要執行的所有服務、腳本與動作。proc
、sys
等虛擬檔案系統。ueventd
(處理硬體事件)和 logd
(記錄系統日誌)。.rc
檔案的定義,設定檔案、目錄和程序的權限。init.rc
會啟動 zygote
服務。Zygote
啟動時,會啟動一個 Java 虛擬機 (VM)。android.app.*
、android.view.*
等)。Zygote
會利用 fork()
系統呼叫,快速複製自己。Zygote
相同的程式碼和已載入的資源,因此可以跳過類別載入的耗時步驟,實現快速啟動。這個階段由 Zygote
孵化出的 System Server
程序來完成,它是 Android 系統的核心骨幹。
System Server
:所有系統服務的集合Zygote
啟動後,它會 fork
出第一個也是最重要的子程序——System Server
。System Server
內部會以一個單一程序、多執行緒的方式,啟動所有核心的系統服務。這些服務是 Android 系統運作的基石。Activity Manager Service (AMS)
:負責管理所有應用程序的生命週期、任務堆疊和活動啟動。Package Manager Service (PMS)
:負責應用程序的安裝、卸載和版本管理,並維護所有已安裝應用的資訊。Window Manager Service (WMS)
:管理所有應用程序的視窗、繪圖表面和螢幕顯示。它決定了哪個視窗顯示在哪個位置,並處理視窗切換。Power Manager Service
(電源管理)、Notification Manager Service
(通知管理)、Binder Service
(IPC 通訊)等。Service Manager
:init
啟動的一個重要服務是 Service Manager
。它是一個服務註冊中心。System Server
啟動各個服務(如 AMS)後,這些服務會向 Service Manager
註冊。當應用程序需要使用某個服務時,它會向 Service Manager
查詢,取得該服務的 Binder 句柄,從而建立通訊。Binder 是 Android 獨有的、高效的 IPC 機制。這是啟動流程的最後階段,最終將使用者帶到可互動的桌面。
System Server
內部所有核心服務都啟動並完成初始化後,System Server
會發出一個廣播,宣告 系統準備就緒 (system ready)。Home
應用程序。Home
應用程序就是我們的 Launcher。Launcher 啟動後,它會繪製使用者介面,例如桌面圖標、應用程式列表、小工具等。init
開始的所有使用者程序,都是 init
的子程序或子孫程序。
Zygote
fork
出來的。
Summary:從硬體的啟動加載器開始,逐步深入到 Linux 核心,再到使用者空間的 init
、Zygote
和 System Server
,最終抵達使用者介面。這個多階段、多程序的啟動流程,確保了系統的安全性、穩定性和啟動效率。
Follow up:在了解了整個啟動流程後,如果想在 Android 系統啟動時執行一個自訂的腳本,應該在哪個階段加入程式碼最合適?為什麼?