iT邦幫忙

2025 iThome 鐵人賽

DAY 2
0

Android AOSP 啟動程序

第一階段:硬體啟動與核心載入

這個階段從按下電源鍵開始,直到 Linux 核心準備好進入使用者空間。

1. 開機與啟動加載器 (Bootloader)

  • 觸發點:當你按下電源鍵,晶片上的 ROM開始執行。
  • 任務
    • 硬體初始化:檢查並初始化關鍵硬體,例如 CPU、記憶體(RAM)和儲存設備。
    • 啟動驗證 (Verified Boot):這是一個重要的安全機制。啟動加載器會驗證系統分區的完整性與來源,以確保沒有被惡意篡改。如果驗證失敗,設備可能無法啟動或進入警告模式。
    • 載入核心:從快閃記憶體中讀取並將 boot.img 載入到 RAM。boot.img 包含了 Linux 核心 (Kernel) 和一個 根檔案系統 (Ramdisk)
    • 移交控制權:最後,啟動加載器會跳轉到核心的入口點,將控制權交給 Linux 核心。

2. Linux 核心啟動 (Kernel Boot)

  • 觸發點:控制權從 Bootloader 轉移到 Linux 核心。
  • 任務
    • 核心自我初始化:核心開始運作,設定記憶體管理單元(MMU)、中斷控制器,並初始化各種硬體驅動程式(如 USB、WiFi、顯示等)。
    • 掛載根檔案系統 (Ramdisk):核心會掛載 Ramdisk,這個 Ramdisk 是一個小型的、臨時的檔案系統,裡面包含了啟動 Android 所需的基礎檔案,最重要的是 init 程序。
    • 啟動 init 程序:這是從核心空間轉向使用者空間的關鍵一步。核心執行 Ramdisk 中的 init 程序,其 PID 永遠為 1。自此,所有後續的程序都將由 init 直接或間接啟動。

**第二階段:使用者空間初始化與服務啟動 **

這個階段的核心是 init 程序,它負責啟動所有 Android 系統所需的核心服務。

1. init 程序:所有程序的始祖

  • 讀取與解析 .rc 檔案init 程序會讀取位於根目錄的 init.rc 和相關的 .rc 腳本檔案。這些檔案就像一份啟動清單,定義了系統啟動時需要執行的所有服務、腳本與動作。
  • 主要任務
    • 建立虛擬檔案系統:掛載 procsys 等虛擬檔案系統。
    • 啟動早期服務:啟動一些底層的守護程序,例如 ueventd(處理硬體事件)和 logd(記錄系統日誌)。
    • 設定權限:根據 .rc 檔案的定義,設定檔案、目錄和程序的權限。

2. Zygote:應用程序的孵化器

  • 觸發點init.rc 會啟動 zygote 服務。
  • 重要性Zygote 是 Android 系統最獨特的設計之一。它是一個特殊的程序,為了解決 Java 應用程序啟動速度慢的問題而生。
  • 運作流程
    1. Zygote 啟動時,會啟動一個 Java 虛擬機 (VM)
    2. 它會預先載入所有 Android 應用程序常用的核心類別庫和資源(例如 android.app.*android.view.* 等)。
    3. 當系統需要啟動一個新的應用程序時,Zygote 會利用 fork() 系統呼叫,快速複製自己。
    4. 新複製出來的子程序擁有與 Zygote 相同的程式碼和已載入的資源,因此可以跳過類別載入的耗時步驟,實現快速啟動。

**第三階段:核心系統服務的啟動 **

這個階段由 Zygote 孵化出的 System Server 程序來完成,它是 Android 系統的核心骨幹。

1. 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 通訊)等。

2. 跨程序通訊 (IPC) 的基石:Binder

  • 啟動 Service Managerinit 啟動的一個重要服務是 Service Manager。它是一個服務註冊中心。
  • 運作原理:當 System Server 啟動各個服務(如 AMS)後,這些服務會向 Service Manager 註冊。當應用程序需要使用某個服務時,它會向 Service Manager 查詢,取得該服務的 Binder 句柄,從而建立通訊。Binder 是 Android 獨有的、高效的 IPC 機制。

**第四階段:使用者介面與應用程序啟動 **

這是啟動流程的最後階段,最終將使用者帶到可互動的桌面。

1. 系統準備就緒 (System Ready)

  • 觸發點:當 System Server 內部所有核心服務都啟動並完成初始化後,System Server 會發出一個廣播,宣告 系統準備就緒 (system ready)

2. 啟動桌面應用 (Launcher)

  • 觸發點:AMS 在收到系統準備就緒的通知後,會查找並啟動 Home 應用程序
  • 任務:通常,這個 Home 應用程序就是我們的 Launcher。Launcher 啟動後,它會繪製使用者介面,例如桌面圖標、應用程式列表、小工具等。

3. 總結與互動

  • 當 Launcher 的 UI 顯示在螢幕上時,標誌著整個 Android AOSP 的啟動流程正式完成。
  • init 開始的所有使用者程序,都是 init 的子程序或子孫程序。
  • 所有 Android 應用程序都是從 Zygote fork 出來的。

Summary:從硬體的啟動加載器開始,逐步深入到 Linux 核心,再到使用者空間的 initZygoteSystem Server,最終抵達使用者介面。這個多階段、多程序的啟動流程,確保了系統的安全性、穩定性和啟動效率。

Follow up:在了解了整個啟動流程後,如果想在 Android 系統啟動時執行一個自訂的腳本,應該在哪個階段加入程式碼最合適?為什麼?


上一篇
00
下一篇
#02
系列文
安豬複習10
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言