Android 架構版本有多個架構相容性矩陣 (FCM),每個可升級的目標 FCM 版本各有一個,定義架構可使用的項目和目標 FCM 版本需求。在 FCM 生命週期中,Android 會淘汰並移除 HIDL HAL,然後修改 FCM 檔案,以反映 HAL 版本的狀態。
如要在自家生態系統中啟用僅限架構的 OTA,擴充供應商介面的合作夥伴也應使用相同方法,淘汰及移除 HIDL HAL。
術語
- 架構相容性矩陣 (FCM)
- XML 檔案:指定符合規範的供應商實作項目架構需求。相容性矩陣會進行版本控管,且每個架構發布版本都會凍結新版本。每個架構版本都包含多個 FCM。
- 平台 FCM 版本 (SF)
- 架構版本中所有 FCM 版本的集合。只要供應商的實作方式符合其中一項 FCM,這個架構就能與該供應商合作。
- FCM 版本 (F)
- 架構版本中所有 FCM 的最高版本。
- 目標 FCM 版本 (V)
- 供應商實作項目符合的目標 FCM 版本 (來自 SF),在裝置資訊清單中明確宣告。供應商實作項目必須根據已發布的 FCM 產生,但可以在裝置資訊清單中宣告較新的 HAL 版本。
- HAL 版本
- HAL 版本的格式為
foo@x.y
,其中foo
是 HAL 名稱,x.y
是特定版本,例如nfc@1.0
、keymaster@3.0
(本文會省略根前置字元,例如android.hardware
)。 - 裝置資訊清單
- XML 檔案:指定供應商介面裝置端提供的 HAL 版本,包括供應商和 ODM 映像檔。裝置資訊清單的內容會受到裝置目標 FCM 版本的限制,但可以列出相對於 V 對應 FC 的全新 HAL。
- 裝置 HAL
- 裝置資訊清單中列出 (提供) 的 HAL,以及架構相容性矩陣 (FCM) 中列出的 HAL。
- 裝置相容性矩陣 (DCM)
- XML 檔案:指定符合架構實作的供應商需求。每部裝置都包含一個 DCM。
- 架構資訊清單
- XML 檔案,用於指定供應商介面架構端提供的 HAL 版本,包括系統、system_ext 和產品映像檔。架構資訊清單中的 HAL 會根據裝置的目標 FCM 版本動態停用。
- 架構 HAL
- 架構資訊清單中列為提供的 HAL,以及裝置相容性矩陣 (DCM) 中列出的 HAL。
程式碼集中的 FCM 生命週期
本文將以抽象方式說明 FCM 生命週期。如要查看支援的資訊清單,請參閱 system/libvintf/include/vintf/Level.h
中的「FCM 所在位置」。hardware/interfaces/compatibility_matrices/compatibility_matrix.<FCM>.xml
如果裝置出貨時搭載的 Android 版本對應到某個 FCM 值,該值應大於或等於對應的等級。舉例來說,搭載 Android 11 的裝置通常會具備 FCM 級別 5,但會實作 FCM 級別 6 以上版本,這類版本會附帶相容性矩陣中指定的各種額外需求。Android 15 支援的等級如下:
FCM | Android 版本 |
---|---|
5 | Android 11/R |
6 | Android 12/S |
7 | Android 13/T |
8 | Android 14/U |
202404 | Android 15/V |
Android 淘汰 FCM 層級後,現有裝置仍可繼續使用。 只要分支版本提供 HAL,以較低 FCM 層級為目標的裝置就能隱含使用較新 FCM 層級列出的 HAL。
在新版 FCM 中開發
Android 會在每個架構發布版本 (例如 Android 8 和 8.1) 時,遞增 FCM 版本。在開發期間,系統會建立新的 compatibility_matrix.F.xml
,且不再變更現有的 compatibility_matrix.f.xml
(其中 f
< F
)。
如要開始使用新的 FCM 版本 F
進行開發,請按照下列步驟操作:
- 將最新
compatibility_matrix.<F-1>.xml
複製到compatibility_matrix.F.xml
。 - 將檔案中的
level
屬性更新為F
。 - 新增對應的建構規則,將這個相容性矩陣安裝到裝置上。
導入新的 HAL
在開發期間,如果要在目前的 FCM 版本 F
中,將新的 HAL (Wi-Fi、NFC 等) 導入 Android,請將 HAL 新增至 compatibility_matrix.F.xml
。
舉例來說,Android 8.1 推出了 cas@1.0
。搭載 Android 8.1 的裝置可以實作這個 HAL,因此下列項目已新增至 compatibility_matrix.F.xml
(在該版本開發期間,暫時命名為 compatibility_matrix.current.xml
):
<hal format="hidl">
<name>android.hardware.cas</name>
<version>1.0</version>
<interface>
<name>IMediaCasService</name>
<instance>default</instance>
</interface>
</hal>
升級 HAL (次要)
AIDL HAL 版本屬於次要 HAL 版本。HIDL 介面版本具有 major.minor
版本,例如 1.2
。
在開發期間,當 AIDL HAL 從 2
升級至目前 FCM 版本 F
的 3
時,新版本會新增至 compatibility_matrix.F.xml
中的 HAL 項目。HAL 項目版本欄位接受 2-3
等範圍。
舉例來說,Android FCM F
導入 foo@3
,做為 HAL 的次要版本升級。舊版 foo@2
用於以舊版 FCM 為目標的裝置,新版 foo@3
則用於以 Android FCM F
為目標的裝置。在 2
之前的舊版 FCM 中,項目如下所示:
<hal format="aidl">
<name>foo</name>
<version>2</version>
<interface>
<name>IFoo</name>
<instance>default</instance>
</interface>
</hal>
這個項目已複製到 compatibility_matrix.F.xml
,並修改為支援版本 3
,如下所示:
<hal format="aidl">
<name>foo</name>
<version>2-3</version>
<interface>
<name>IFoo</name>
<instance>default</instance>
</interface>
</hal>
升級 HAL (重大)
在開發期間,如果 HAL 在目前的 FCM 版本 F
進行重大版本升級,系統會將新的主要版本 x.0
新增至 compatibility_matrix.F.xml
,並採用下列設定:
- 如果隨附
V = F
的裝置必須啟動x.0
,則只能使用x.0
版本。 - 如果舊版主要版本位於同一個
<hal>
標記中,搭載V = F
的裝置就能啟動舊版主要版本。
舉例來說,FCM 版本 F
會將 foo@2.0
導入為 1.0 HAL 的主要版本升級,並淘汰 1.0 HAL。舊版 foo@1.0
適用於指定舊版 FCM 的裝置。如果裝置提供 HAL,且目標為 FCM 版本 F
,則必須提供新的 2.0 版。在本例中,舊版 FCM 包含以下項目:
<hal format="hidl">
<name>foo</name>
<version>1.0</version>;
<interface>
<name>IFoo</name>
<instance>default</instance>
</interface>
</hal>
將這個項目複製到 compatibility_matrix.F.xml
,然後按照下列方式修改:
<hal format="hidl">
<name>foo</name>
<version>2.0</version>
<interface>
<name>IFoo</name>
<instance>default</instance>
</interface>
</hal>
限制:
- 由於 1.0 HAL 不在
compatibility_matrix.F.xml
中,以 FCM 版本F
為目標的裝置不得提供 1.0 HAL (因為這個 HAL 已淘汰)。 - 由於舊版 FCM 中有 1.0 HAL,架構仍可與 1.0 HAL 搭配運作,因此可回溯相容於以舊版 FCM 為目標的舊裝置。
新版 FCM
在系統分割區發布 FCM 版本的程序完全由 Google 執行,是 AOSP 版本的一部分,包括下列步驟:
- 確認
compatibility_matrix.F.xml
具有level="F"
屬性。 - 確認所有裝置都能建構及啟動。
- 更新 VTS 測試,確保搭載最新架構 (以出貨 API 級別為準) 的裝置採用目標 FCM 版本
V >= F
。 - 將檔案發布至 AOSP。
舉例來說,VTS 測試可確保搭載 Android 9 的裝置,其目標 FCM 版本 >= 3。
此外,產品和 system_ext FCM 也可能會列出各平台 FCM 版本的相關需求。產品和 system_ext 分區的 FCM 版本分別由這些映像檔的擁有者發布。產品和 system_ext 分區的 FCM 版本號碼必須與系統分區的號碼一致。與系統分割區的 FCM 版本類似,產品和 system_ext 分割區中 FCM 版本 F 的相容性矩陣,反映了目標 FCM 版本為 F 的裝置需求。
淘汰 HAL 版本
淘汰 HAL 版本是開發人員的決定 (也就是說,如果是 AOSP HAL,則由 Google 決定)。發布較新的 HAL 版本 (次要或主要版本) 時,就可能發生這種情況。
淘汰裝置 HAL
如果特定裝置 HAL foo@x.y
在 FCM 版本 F
中已遭淘汰,表示任何搭載目標 FCM 版本 V = F
以上的裝置,都不得實作 foo
的 x.y
版本或任何舊版。x.y
架構仍支援已淘汰的 HAL 版本,可供裝置升級。
發布 FCM 版本 F
時,如果最新 FCM for Target FCM 版本 V = F
未明確指出特定 HAL 版本,該 HAL 版本就會視為已淘汰。foo@x.y
如果裝置搭載 V = F
,則必須符合下列任一條件:
- 架構需要較高版本 (主要或次要);
- 架構不再需要 HAL。
舉例來說,在 Android 9 中,health@2.0
是 1.0 HAL 的主要版本升級。health@1.0
已從 compatibility_matrix.3.xml
中移除,但存在於 compatibility_matrix.legacy.xml
、compatibility_matrix.1.xml
和 compatibility_matrix.2.xml 中。
因此,health@1.0
已淘汰。
淘汰架構 HAL
如果特定架構 HAL foo@x.y
在 FCM 版本 F
中遭到淘汰,表示以目標 FCM 版本 V = F
以上推出的任何裝置,都不應期望架構提供 foo
版本 x.y
,或任何舊於 x.y
的版本。架構仍會為升級裝置提供已淘汰的 HAL 版本。
FCM 版本 F
發布後,如果架構資訊清單指定 foo@x.y
,則 HAL 版本 foo@x.y
會視為已淘汰。max-level="F - 1"
如果裝置搭載 V = F
,架構不會提供 HAL foo@x.y
。在搭載 V = F
的裝置上,裝置相容性矩陣不得列出含有 max-level < V
的架構 HAL。
舉例來說,在 Android 12 中,schedulerservice@1.0
已遭淘汰。其 max-level
屬性設為 5
,這是 Android 11 推出的 FCM 版本。請參閱 Android 12 架構資訊清單。
移除對目標 FCM 版本的支援
當特定目標 FCM 版本 V
的有效裝置數量低於特定門檻時,系統會從下一版架構的 SF 集合中移除該目標 FCM 版本。請按照下列步驟操作:
從建構規則中移除
compatibility_matrix.V.xml
(以免安裝在系統映像檔上),並刪除實作或依附於已移除功能的任何程式碼。從架構資訊清單中移除
max-level
低於或等於V
的架構 HAL,並刪除任何實作已移除架構 HAL 的程式碼。
如果裝置的目標 FCM 版本不在特定架構版本的 SF 範圍內,就無法升級至該版本。
移除完全淘汰的 HAL
移除 FCM 版本後,任何 FCM 都不會再包含某些 HAL 介面或 HAL 介面版本。也就是說,Android 不再支援這些裝置,即使是升級裝置也不例外。
不再支援 HAL 後,開發人員會從 Android 移除對該 HAL 介面的參照,包括架構中的用戶端程式碼、預設實作項目和 VTS 測試案例。
如果沒有任何支援的 HAL 繼承要移除的 HAL,只要多幾個步驟,即可移除 HAL 定義本身。
- 從原始碼中移除 HAL 介面定義。包括
*.aidl
檔案和Android.bp
aidl_interface
模組。 - 如果是 HIDL,請從
hardware/interfaces/current.txt
移除 HASH。 - 如果是 AIDL,請移除含有凍結 AIDL 檔案的
aidl_api
目錄。 - 從
hardware/interfaces/compatibility_matrices/exclude/fcm_exclude.cpp
移除介面。
HAL 版本狀態
以下各節將依時間順序說明 HAL 版本可能處於的狀態。
尚未發布的項目
如果是裝置 HAL,如果 HAL 版本不在任何公開和凍結的相容性矩陣中,則視為未發布,可能仍在開發中。包括僅存在於 compatibility_matrix.F.xml
的 HAL 版本。
例如:
- 在 Android 9 開發期間,
health@2.0
HAL 視為未發布的 HAL,且只存在於compatibility_matrix.3.xml
中。 teleportation@1.0
HAL 不在任何已發布的相容性矩陣中,且也視為未發布的 HAL。
如果是架構 HAL,如果 HAL 版本只存在於不相關開發分支的架構資訊清單中,則視為未發布。
已發布且為最新版本
如果是裝置 HAL,只要 HAL 版本位於任何公開且凍結的相容性矩陣中,就會發布。舉例來說,FCM 第 3 版凍結並發布至 Android 開放原始碼計畫後,health@2.0
HAL 就會視為已發布的最新 HAL 版本。
如果 HAL 版本位於公開且凍結的相容性矩陣中,且該矩陣具有最高的 FCM 版本,則 HAL 版本為最新版本 (即未遭淘汰)。舉例來說,compatibility_matrix.3.xml
中現有的 HAL 版本 (例如 compatibility_matrix.legacy.xml
中導入的 nfc@1.0
) 也視為已發布的現行 HAL 版本。
如果是架構 HAL,如果 HAL 版本位於最新發布分支的架構資訊清單中,且沒有 max-level
屬性,或 (不尋常地) max-level
等於或高於此分支中發布的 FCM 版本,則視為已發布的現行 HAL 版本。舉例來說,Android 12 架構資訊清單指定了 Android 12 中發布的 displayservice
HAL。
已發布但已淘汰
如果符合下列所有條件,裝置 HAL 版本就會遭到淘汰:
- 已發布。
- 不在公開且凍結的相容性矩陣中,且該矩陣具有最高的 FCM 版本。
- 架構仍支援的公開凍結相容性矩陣。
例如:
health@1.0
HAL 位於compatibility_matrix.legacy.xml
、compatibility_matrix.1.xml
和compatibility_matrix.2.xml
,但不在compatibility_matrix.3.xml
中。因此在 Android 9 中,這項功能已淘汰。- Android 9 的電源 HAL 有次要版本升級,但
power@1.0
仍處於compatibility_matrix.3.xml
。 power@1.0
compatibility_matrix.legacy.xml
、compatibility_matrix.1.xml
和compatibility_matrix.2.xml
。compatibility_matrix.3.xml
的值power@1.0-1
。
因此 power@1.0
是 Android 9 的現行版本,但並非已淘汰。
如果是架構 HAL,如果 HAL 版本位於最新發布分支的架構資訊清單中,且 max-level
屬性低於此分支中的 FCM 版本發布,則視為已發布但已淘汰的 HAL 版本。舉例來說,Android 12 中已發布 schedulerservice
HAL,但已遭淘汰,如 Android 12 架構資訊清單所指定。
已移除
針對裝置 HAL,只有在符合下列條件時,系統才會移除 HAL 版本:
- 這項功能先前已發布。
- 架構支援的任何公開和凍結相容性矩陣中,都沒有這個項目。
公開且凍結但架構不支援的相容性矩陣會保留在程式碼庫中,用於定義已移除的 HAL 版本集,以便編寫 VTS 測試,確保新裝置上沒有已移除的 HAL。
如果是架構 HAL,只有在符合下列條件時,才會移除 HAL 版本:
- 這項功能先前已發布。
- 不在最新發布分支版本的任何架構資訊清單中。
舊版 FCM
Target FCM Version legacy 是所有非 Treble 裝置的特殊值。舊版 FCM compatibility_matrix.legacy.xml
列出舊版裝置 (即 Android 8.0 推出前發布的裝置) 的架構需求。
如果 FCM 存在這個檔案,且版本為 F
,只要裝置資訊清單與這個檔案相容,任何非 Treble 裝置都可以升級至 F
。移除程序與其他 Target FCM 版本相同 (當有效前 8.0 裝置數量低於特定門檻時移除)。
已發布的 FCM 版本
如要查看已發布的 FCM 版本清單,請前往 hardware/interfaces/compatibility_matrices
。
如要找出特定 Android 版本隨附的 FCM 版本,請參閱 Level.h
。