AOSP 專案結構與原始碼
AOSP 的主要目錄結構
看 source code 這邊有:
以下是精簡版的目錄架構(實際專案更龐大):
AOSP/
├── build/ # 編譯系統 (Makefiles, Soong, Ninja)
├── device/ # 各裝置專屬設定 (機型、SoC、驅動配置)
├── kernel/ # Linux Kernel 原始碼 (部分開源)
├── system/ # 系統組件 (init, core, netd...)
├── frameworks/ # Framework API 與系統服務 (AMS, WMS...)
├── packages/ # 系統應用 (Settings, SystemUI, Launcher...)
├── hardware/ # HAL 實作 (Camera, Audio, GPS...)
├── external/ # 外部開源庫 (SQLite, Webkit, OpenSSL...)
├── libcore/ # Java 基礎函式庫 (與 JDK 對應)
├── art/ # Android Runtime (ART, GC, JIT)
├── cts/ # Compatibility Test Suite (測試框架)
├── vendor/ # 廠商專屬實作 (Driver HAL, blobs)
└── out/ # 編譯輸出 (system.img, boot.img...)
目錄詳解
-
build/
- 負責 編譯系統 (Build System)
- 主要包含:
- build/make/ → 傳統 Makefile 編譯
- build/soong/ → 新一代 Build System (用 Go 語言寫成)
- 功能:
- 設定編譯選項
- 定義 Android.mk / Android.bp
- 產出最終 system.img, boot.img
-
device/
- 儲存裝置與硬體配置
- 內容:
- 裝置樹 (Device Tree)
- 開機參數 (bootloader, recovery)
- HAL 載入方式
- 例如:
device/google/pixel/
├── BoardConfig.mk
├── device.mk
└── overlay/
==> 每台手機、平板、電視等等裝置,都會在這裡有專屬目錄。
-
kernel/
- 儲存 Linux Kernel 原始碼 或對應版本的 patch
- 一般 AOSP 不會完整開源所有 Kernel,會依裝置 SoC 廠商 (Qualcomm, MediaTek) 提供的分支整合
-
system/
- 包含 Android 系統的 核心元件
- 常見子目錄:
- system/core/:init, adbd, logd, servicemanager
- system/netd/:網路服務
- system/sepolicy/:SELinux 設定
==> init 程序就在 system/core/init/,是 Android 開機流程的起點之一。
-
frameworks/
最重要的目錄之一⚠️⚠️⚠️
- frameworks/base/
- Android Framework API 與系統服務
- 例如:
- core/java/android/app/ → Activity, Service, Context 等 API
- services/java/com/android/server/ → AMS, WMS, PMS 實作
- core/res/res/ → 系統資源 (字串、佈局)
- frameworks/native/
- Native Framework (C++)
- 例如:SurfaceFlinger、Binder Native API、GraphicBuffer
- frameworks/av/
==> 開發者最常 study 的部分是 frameworks/base,因為它包含了 App 與系統的橋樑。
- packages/
- 儲存 系統應用 原始碼
- 例如:
- packages/apps/Settings/ → 系統設定 App
- packages/apps/Launcher3/ → Launcher (桌面)
- packages/SystemUI/ → 狀態列、通知欄
- packages/providers/ContactsProvider/ → 通訊錄資料庫
==> 如果要修改系統 UI 或預設 App,通常會從這裡下手。
-
hardware/
- 硬體抽象層 (HAL) 的實作
- 例如:
- hardware/libhardware/:HAL 定義
- hardware/interfaces/:HIDL/AIDL 介面定義
- hardware/qcom/:Qualcomm SoC HAL
- hardware/google/:Google Pixel HAL
==> 如果你要修改 Camera 或 Audio 驅動的上層介面,會從這裡開始。
-
external/
- 外部開源套件
- 例如:
- external/sqlite/
- external/openssl/
- external/webview/
-
libcore/
- Java 基礎函式庫,對應 JDK Class Library
- 例如:
- libcore/luni/ → java.lang, java.util 等核心類別
- libcore/ojluni/ → 與 OpenJDK 同步
-
art/
- Android Runtime (ART)
- 內容:
- JIT、AOT 編譯器
- 垃圾回收 (GC) 機制
- dex2oat 工具
==> 如果要 study Java/Kotlin 程式如何被執行,需要讀這裡。
-
cts/
- Compatibility Test Suite
- 確保第三方裝置符合 Android 相容性規範 (CTS 測試必須通過才能獲得 Google 認證)
-
vendor/
- 廠商專屬程式碼
- 內容通常包含:
- GPU 驅動程式 (如 Adreno, Mali)
- 專屬 HAL 模組
- 預載應用程式
source code study
- 從啟動流程開始
- init (system/core/init/)
- Zygote (frameworks/base/core/java/com/android/internal/os/ZygoteInit.java)
- SystemServer (frameworks/base/services/java/com/android/server/SystemServer.java)
- 啟動所有 System Services (AMS, WMS, PMS, etc.)
- Framework 層 API
- Ex. startActivity()
- Application 層呼叫
- android.app.Activity.startActivity()
- 進入 AMS
- ActivityManagerService.startActivity()
- Binder IPC 呼叫
- 通知 WMS 顯示視窗
- WindowManagerService.addWindow()
- 系統應用導讀
- Ex. Settings App (packages/apps/Settings/)
- AndroidManifest.xml → App 的組件定義
- src/com/android/settings/ → Java/Kotlin 原始碼
- res/layout/ → XML 介面檔案
- res/values/ → 多國語系字串
==> 與一般 Android App 結構類似,但使用到更多 Framework API。
- 分層理解
AOSP 專案結構龐大,但可以依 layer 理解:
- Kernel → system/ → frameworks/ → packages/
- Frameworks/base 是最核心的部分,掌管 API 與 System Services
- 從 init → Zygote → SystemServer → AMS/WMS/PMS 最為清晰
- 應用程式 (packages/) 與 Framework 交互,是理解 App 運作的最佳起點
interview questions
- 如果要修改 Android 的 開機流程,應該從哪些檔案著手?
- 為什麼 Google 將 Framework API 放在 frameworks/base/core/java/ 而不是其他目錄?
- 在閱讀 startActivity() 流程時,你能指出哪些地方發生了跨進程通訊 (IPC) 嗎?