目錄
一、平臺架構模塊
1.1 Linux 內核?
1.2?硬件抽象層 (HAL)?
1.3?Android 運行時?
1.4?原生 C/C++ 庫?
1.5 Java API 框架?
1.6?系統應用?
二、系統啟動流程
2.1?Bootloader階段
2.2?內核啟動
2.3?Init進程(PID 1)
2.4?Zygote與System Server
2.5?系統就緒與用戶界面
2.6?優化與安全機制
三、關鍵分區與故障處理
四、總結
五、常見誤解澄清
一、平臺架構模塊
Android 是一個基于 Linux 的開源軟件堆棧,針對多種不同設備類型打造。圖 1 顯示了 Android 平臺的主要組件。
1.1 Linux 內核?
Android 平臺的基礎是 Linux 內核。例如,Android 運行時 (ART)?依賴 Linux 內核來實現底層功能,例如線程處理和低級內存管理。
使用 Linux 內核可讓 Android 利用關鍵安全功能,并讓設備制造商能夠為知名內核開發硬件驅動程序。
1.2?硬件抽象層 (HAL)?
硬件抽象層 (HAL)?提供了用于向較高級別的?Java API 框架公開設備硬件功能的標準接口。HAL 由多個庫模塊組成,每個模塊都為特定類型的硬件組件(例如相機或藍牙模塊)實現一個接口。當框架 API 發出調用以訪問設備硬件時,Android 系統將為該硬件組件加載庫模塊。
**硬件抽象層(HAL)**通過標準接口實現了硬件能力與Java框架的解耦。其核心價值體現在:
-
模塊化設計:每個硬件組件(如藍牙、傳感器)對應獨立.so庫
-
動態加載機制:當應用調用Camera API時,系統自動加載對應的Camera HAL模塊
-
版本兼容:通過HIDL接口定義語言保證跨版本兼容性
這種設計使得OEM廠商可以靈活實現硬件功能,同時保持應用層API的穩定性。
1.3?Android 運行時?
對于搭載 Android 5.0(API 級別 21)或更高版本的設備,每個應用都在其自己的進程中運行,并且有其自己的?Android 運行時 (ART)?實例。ART 編寫為通過執行 Dalvik 可執行文件格式 (DEX) 文件,在低內存設備上運行多個虛擬機。DEX 文件是一種專為 Android 設計的字節碼格式,針對最小的內存占用量進行了優化。構建工具(如?d8)可將 Java 源代碼編譯成 DEX 字節碼,此類字節碼可在 Android 平臺上運行。
ART 的部分主要功能包括:
- 預先 (AOT) 和即時 (JIT) 編譯
- 優化的垃圾回收 (GC)
- 在 Android 9(API 級別 28)及更高版本中,可將應用軟件包的 DEX 文件轉換為更緊湊的機器代碼
- 可提供更好的調試支持,包括專用采樣剖析器、詳細的診斷異常和崩潰報告,以及設置觀察點以監控特定字段的能力
在 Android 版本 5.0(API 級別 21)之前,Dalvik 是 Android 運行時。如果您的應用在 ART 上運行良好,那么它也可以在 Dalvik 上運行,但反過來不一定。
Android 還包含一套核心運行時庫,可提供 Java API 框架所使用的 Java 編程語言中的大部分功能,包括一些?Java 8 語言功能。
從Dalvik到ART的演進標志著Android性能的質的飛躍:
特性 | Dalvik | ART |
---|---|---|
編譯方式 | JIT即時編譯 | AOT預先編譯 |
內存占用 | 較高 | 優化減少40% |
啟動速度 | 較慢 | 提升50%以上 |
GC效率 | 暫停時間較長 | 并發標記清除 |
ART運行時的關鍵技術創新:
-
支持Java 8 Lambda表達式
-
引入Compact DEX格式減少安裝體積
-
診斷工具支持內存泄漏檢測
-
多Dex文件并行加載加速冷啟動
1.4?原生 C/C++ 庫?
許多核心 Android 系統組件和服務(如 ART 和 HAL)都是從需要用 C 和 C++ 編寫的原生庫的原生代碼構建的。Android 平臺提供 Java 框架 API,用于向應用提供其中一些原生庫的功能。例如,您可以通過 Android 框架的?Java OpenGL API?訪問?OpenGL ES,以支持在應用中繪制和操控 2D 和 3D 圖形。
如果開發的是需要 C 或 C++ 代碼的應用,可以使用?Android NDK?直接從原生代碼訪問某些原生平臺庫。
1.5 Java API 框架?
您可通過以 Java 語言編寫的 API 使用 Android 操作系統的整個功能集。這些 API 是創建 Android 應用所需的構建塊的基礎,可簡化核心、模塊系統組件和服務的重復使用,包括以下組件和服務:
- 豐富且可擴展的視圖系統,可用于構建應用界面,包括列表、網格、文本框、按鈕,甚至可嵌入的網絡瀏覽器
- 資源管理器,用于訪問非代碼資源,例如本地化的字符串、圖形和布局文件
- 通知管理器,可讓所有應用在狀態欄中顯示自定義提醒
- 一個?activity 管理器,用于管理應用的生命周期,并提供常見的導航返回堆棧
- Content Provider,可讓應用訪問其他應用(例如“通訊錄”應用)中的數據或共享自己的數據
開發者可以完全訪問 Android 系統應用使用的相同框架 API。
1.6?系統應用?
Android 隨附一套用于電子郵件、短信、日歷、互聯網瀏覽和通訊錄等的核心應用。平臺隨附的應用與用戶可以選擇安裝的應用一樣,沒有特殊狀態。因此,第三方應用可以成為用戶的默認網絡瀏覽器、短信應用甚至默認鍵盤。但有一些例外情況,例如系統的“設置”應用。
系統應用既可用作用戶體驗應用,又能提供開發者可從自己的應用訪問的關鍵功能。例如,如果您希望應用發送短信,則無需自行構建該功能。您可以改為調用已安裝的短信應用,將消息發送給您指定的接收者。
二、系統啟動流程
Android啟動流程的大致步驟:
1. 電源啟動,執行Boot ROM中的代碼,加載Bootloader。
2. Bootloader加載內核和initramfs到內存。
3. 內核初始化硬件和驅動,掛載文件系統,啟動init進程。
4. init進程解析init.rc,啟動系統服務,包括Zygote。
5. Zygote啟動System Server,System Server啟動各種系統服務。
6. 系統服務啟動完成后,啟動Launcher,進入用戶界面。
此流程體現了Android從硬件初始化到用戶交互的完整鏈路,結合Linux內核與獨特的Android服務設計,確保了系統的高效啟動與運行。
Android系統的啟動流程是一個復雜但結構化的過程,涉及多個階段的協同工作。以下是整理后的詳細流程:
2.1?Bootloader階段
-
Boot ROM:設備上電后,執行芯片內固化的代碼(Boot ROM),初始化硬件并加載第一階段的Bootloader。
-
Bootloader:通常分為多個階段(如Primary和Secondary),負責驗證簽名、加載內核和initramfs到內存。常見的Bootloader如U-Boot或廠商定制版本。
2.2?內核啟動
-
Linux內核初始化:內核解壓后,初始化CPU、內存、設備驅動等,掛載根文件系統(通常為ramdisk)。
-
掛載系統分區:內核掛載/system(只讀)、/data(讀寫)等分區,可能涉及dm-verity驗證系統完整性。
2.3?Init進程(PID 1)
-
解析init.rc腳本:執行早期初始化(如創建目錄、設置權限),啟動核心守護進程(ueventd、logd)。
-
啟動關鍵服務:
-
Zygote:通過
app_process
啟動,預加載Java核心類和資源,監聽Socket等待孵化應用進程。 -
Service Manager:Binder IPC的核心管理服務。
-
SurfaceFlinger:圖形合成服務,負責渲染UI。
-
Media Server:多媒體相關服務。
-
2.4?Zygote與System Server
-
Zygote孵化System Server:Zygote fork出System Server進程(Java層核心)。
-
System Server啟動:
-
Binder線程池初始化:啟用跨進程通信。
-
核心服務啟動順序:
-
Activity Manager:管理應用生命周期。
-
Package Manager:管理應用安裝與信息。
-
Window Manager:窗口管理。
-
Power Manager、Battery Service等其他服務。
-
-
服務依賴管理:確保服務按正確順序啟動。
-
2.5?系統就緒與用戶界面
-
Launcher啟動:System Server完成后,Activity Manager啟動主屏幕應用(如Launcher3)。
-
廣播通知:發送
ACTION_BOOT_COMPLETED
,告知應用系統啟動完成。
2.6?優化與安全機制
-
并行啟動:Android 8.0+采用并行初始化服務,縮短啟動時間。
-
安全驗證:Bootloader驗證內核簽名,dm-verity確保系統分區完整性。
三、關鍵分區與故障處理
-
分區結構:
/boot
(內核+ramdisk)、/system
(系統應用)、/recovery
(恢復模式)、/data
(用戶數據)。 -
異常處理:啟動失敗時進入Recovery模式或Fastboot,進行系統修復。
四、總結
-
第一個用戶進程:
init
?進程(PID 1)。 -
核心作用:架起內核與用戶空間的橋梁,管理所有后續進程的啟動。
-
關鍵文件:
/init
?二進制文件、init.rc
?配置文件。
五、常見誤解澄清
-
Zygote 不是第一個用戶進程:雖然 Zygote 是 Java 層應用進程的起點,但它是由?
init
?進程通過解析?init.rc
?腳本啟動的。 -
內核線程 vs 用戶進程:內核啟動階段會運行內核線程(如?
kthreadd
),但這些屬于內核空間,不屬于用戶進程。