跳至主要内容

你的手機在 Android 發表前就準備好了:聊聊 PDK 與 aosp.xml

每年 Google 發表新版 Android 的時候,總會有一批手機在幾個月內就跟著升級。這件事其實有點違反直覺——原始碼不是剛剛才公開嗎?晶片廠和手機廠是怎麼做到的?

答案是:他們早就拿到了。這中間有一層東西叫 PDK

PDK 是什麼

PDK 的全名是 Platform Development Kit,平台開發套件。

Android 雖然是開源專案,但「開源」跟「所有人同時拿到」是兩回事。Google 會在新版 Android 正式公開之前,透過 NDA 把平台的原始碼與相關資源先交給合作夥伴——主要是 SoC 廠(聯發科、高通這些做晶片的)和手機品牌廠。

為什麼要這樣做?因為晶片的驅動、電源管理、相機 pipeline、視訊編解碼這些東西,都得跟著新版 Android 的框架改動一起調整。如果等到程式碼公開才開始做,等 BSP 弄好、驗證完、送進手機廠,市面上的機器大概要再等一年才升得上去。

所以 PDK 的存在,本質上是把整條供應鏈的時間軸往前推。等 AOSP 公開發布那天,晶片廠手上的東西早就跑起來了。

值得一提的是,Android 這幾年推的 Treble、GKI(Generic Kernel Image)這些架構調整,也都在往同一個方向使力:讓晶片層跟框架層盡量解耦,讓升級不用整包重來。PDK 是流程上的提前,Treble 是架構上的鬆綁,兩件事在解同一個問題。

那 aosp.xml 又是什麼

拿到 PDK 之後,接下來的問題是:這麼多程式碼要怎麼交付?

Android 的原始碼不是一個 git repo,而是幾百上千個獨立的 git repo。framework 是一個、bionic 是一個、每個 app、每個 library 都可能各自是一個。所以 Google 做了一個工具叫 repo,專門管理這種「一堆 git repo 組成的專案」。

repo 要怎麼知道該抓哪些 repo、每個要抓哪個版本、要放到本機的哪個資料夾?靠的就是 manifest 檔案——一份 XML 清單。

aosp.xml 就是其中一份典型的 manifest。它大致長這樣(示意):

<manifest>
<remote name="aosp" fetch="..." />
<default remote="aosp" revision="android-XX.X.X_rX" />

<project path="frameworks/base" name="platform/frameworks/base" />
<project path="system/core" name="platform/system/core" />
<!-- ...以下數百行 -->
</manifest>

一行一個專案,指明「從哪抓、抓哪個版本、放到哪」。你下 repo init -u <url> -m aosp.xmlrepo sync,它就照著清單把整棵樹拉下來。

在實際的交付情境裡,manifest 通常不會只有一份。純 AOSP 的部分歸 aosp.xml,晶片廠自己的 BSP 與私有模組放另一份,手機廠再疊一層自己的客製專案。三份合起來,才是一棵能 build 出韌體的完整原始碼樹。

這種分法有個很實際的理由:權責分離。哪些是 Google 的、哪些是晶片廠的、哪些是自己的,一看 manifest 就清楚。出問題時也知道該找誰。

一個容易踩的觀念

manifest 裡的 revision 通常會被釘死在特定的 tag 或 commit,而不是指向某個 branch 的最新狀態。

這點常讓剛接觸的人困惑:「我 sync 到最新的不是比較好嗎?」

不是。因為晶片廠的 BSP 是針對那個特定版本的 AOSP 開發與驗證的。你把 AOSP 那部分偷偷往前推,另外兩層卻沒動,介面對不上,輕則 build 不過,重則 build 得過但跑起來行為詭異——後者更麻煩,因為你會花很久才發現問題出在這裡。

整棵樹是一個經過驗證的組合,不是三個可以各自更新的獨立元件。這個心智模型比任何指令都重要。

小結

  • PDK 是 Google 提前交付給合作夥伴的平台開發套件,讓晶片廠和手機廠能在 Android 公開前就開始準備
  • repo 是管理 Android 這種多 git repo 專案的工具,manifest 則是它的清單
  • aosp.xml 是描述 AOSP 部分的 manifest,實務上會跟晶片廠、品牌廠的 manifest 疊在一起用
  • manifest 裡的版本是刻意鎖定的,那是一個驗證過的組合,不要隨手往前推

下次看到某支手機在 Android 發表後兩個月就升級了,你就知道背後這條線是從什麼時候開始拉的了。


本文只談公開的概念與工具用法,不涉及任何廠商的具體交付內容。