iT邦幫忙

2025 iThome 鐵人賽

DAY 5
0

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...)

目錄詳解
  1. build/
  • 負責 編譯系統 (Build System)
  • 主要包含:
    • build/make/ → 傳統 Makefile 編譯
    • build/soong/ → 新一代 Build System (用 Go 語言寫成)
  • 功能:
    • 設定編譯選項
    • 定義 Android.mk / Android.bp
    • 產出最終 system.img, boot.img
  1. device/
  • 儲存裝置與硬體配置
  • 內容:
    • 裝置樹 (Device Tree)
    • 開機參數 (bootloader, recovery)
    • HAL 載入方式
  • 例如:
    device/google/pixel/
    ├── BoardConfig.mk
    ├── device.mk
    └── overlay/

==> 每台手機、平板、電視等等裝置,都會在這裡有專屬目錄。

  1. kernel/
  • 儲存 Linux Kernel 原始碼 或對應版本的 patch
  • 一般 AOSP 不會完整開源所有 Kernel,會依裝置 SoC 廠商 (Qualcomm, MediaTek) 提供的分支整合
  1. system/
  • 包含 Android 系統的 核心元件
  • 常見子目錄:
    • system/core/:init, adbd, logd, servicemanager
    • system/netd/:網路服務
    • system/sepolicy/:SELinux 設定

==> init 程序就在 system/core/init/,是 Android 開機流程的起點之一。

  1. 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/
    • Media Framework:音訊、影片、相機

==> 開發者最常 study 的部分是 frameworks/base,因為它包含了 App 與系統的橋樑。

  1. packages/
  • 儲存 系統應用 原始碼
  • 例如:
    • packages/apps/Settings/ → 系統設定 App
    • packages/apps/Launcher3/ → Launcher (桌面)
    • packages/SystemUI/ → 狀態列、通知欄
    • packages/providers/ContactsProvider/ → 通訊錄資料庫

==> 如果要修改系統 UI 或預設 App,通常會從這裡下手。

  1. hardware/
  • 硬體抽象層 (HAL) 的實作
  • 例如:
    • hardware/libhardware/:HAL 定義
    • hardware/interfaces/:HIDL/AIDL 介面定義
    • hardware/qcom/:Qualcomm SoC HAL
    • hardware/google/:Google Pixel HAL

==> 如果你要修改 Camera 或 Audio 驅動的上層介面,會從這裡開始。

  1. external/
  • 外部開源套件
  • 例如:
    • external/sqlite/
    • external/openssl/
    • external/webview/
  1. libcore/
  • Java 基礎函式庫,對應 JDK Class Library
  • 例如:
    • libcore/luni/ → java.lang, java.util 等核心類別
    • libcore/ojluni/ → 與 OpenJDK 同步
  1. art/
  • Android Runtime (ART)
  • 內容:
    • JIT、AOT 編譯器
    • 垃圾回收 (GC) 機制
    • dex2oat 工具

==> 如果要 study Java/Kotlin 程式如何被執行,需要讀這裡。

  1. cts/
  • Compatibility Test Suite
  • 確保第三方裝置符合 Android 相容性規範 (CTS 測試必須通過才能獲得 Google 認證)
  1. vendor/
  • 廠商專屬程式碼
  • 內容通常包含:
    • GPU 驅動程式 (如 Adreno, Mali)
    • 專屬 HAL 模組
    • 預載應用程式
source code study
  1. 從啟動流程開始
  • init (system/core/init/)
    • 負責掛載檔案系統、啟動 Zygote
  • Zygote (frameworks/base/core/java/com/android/internal/os/ZygoteInit.java)
    • 負責 fork 新的 App 進程
  • SystemServer (frameworks/base/services/java/com/android/server/SystemServer.java)
    • 啟動所有 System Services (AMS, WMS, PMS, etc.)
  1. Framework 層 API
  • Ex. startActivity()
    • Application 層呼叫
      • android.app.Activity.startActivity()
    • 進入 AMS
      • ActivityManagerService.startActivity()
    • Binder IPC 呼叫
      • App 與 SystemServer 溝通
    • 通知 WMS 顯示視窗
      • WindowManagerService.addWindow()
  1. 系統應用導讀
  • Ex. Settings App (packages/apps/Settings/)
    • AndroidManifest.xml → App 的組件定義
    • src/com/android/settings/ → Java/Kotlin 原始碼
    • res/layout/ → XML 介面檔案
    • res/values/ → 多國語系字串

==> 與一般 Android App 結構類似,但使用到更多 Framework API。

  1. 分層理解
    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) 嗎?

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

尚未有邦友留言

立即登入留言