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
)。 - 裝置資訊清單
- 用於指定供應商介面裝置端裝置端的 HAL 版本 (包括廠商和 ODM 映像檔) 的 XML 檔案。裝置資訊清單的內容受到裝置目標 FCM 版本的限制,但可以列出與 V 對應 FC 相對較新的 HAL。
- 裝置 HAL
- 列在裝置資訊清單中 (提供的) 並在架構相容性矩陣 (FCM) 中列出的 HAL (必要或選用)。
- 裝置相容性矩陣 (DCM)
- 指定供應商符合架構實作需求的 XML 檔案。每部裝置都有一個 DCM。
- 架構資訊清單
- XML 檔案,用於指定供應商介面架構端的 HAL 版本,包括系統、system_ext 和產品映像檔。系統會根據裝置的目標 FCM 版本,動態停用架構資訊清單中的 HAL。
- 架構 HAL
- 列在架構資訊清單中提供的 HAL,並在裝置相容性矩陣 (DCM) 中列為必要或選用項目。
程式碼集中的 FCM 生命週期
本文件說明摘要中的 FCM 生命週期。如要查看目前支援的資訊清單,請參閱 hardware/interfaces/compatibility_matrix.<FCM>.xml
(可在 system/libvintf/include/vintf/Level.h
中找到 FCM)。
假如裝置運送到對應的 Android 發布版本,FCM 值應大於或等於同等等級。舉例來說,搭載 Android 11 的裝置一般會有 FCM 級別 5,但實作的 FCM 級別 6 以上,除了相容性矩陣中指定的各種額外要求外,支援的等級如下:
FCM | Android 版本 |
---|---|
4 | Android 10/Q |
5 | Android 11/R |
6 | Android 12/S |
7 | Android 13/T |
8 | Android 14/U |
202404 | Android 15/V |
即使 Android 淘汰了 FCM 級別,現有裝置仍支援此級別。
在新的 FCM 版本中進行開發
Android 會累加每個架構版本的 FCM 版本 (例如 Android 8、8.1 等)。在開發期間,系統會建立新的 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
向 Android 推出新的 HAL (Wi-Fi、NFC 等) 時,請使用以下 optional
設定將 HAL 新增至 compatibility_matrix.F.xml
:
- 如果隨附
V = F
的裝置必須搭配此 HAL 啟動,optional="false"
- 如果搭載
V = F
的裝置可在沒有此 HAL 的情況下啟動,則為optional="true"
。
舉例來說,Android 8.1 推出了 cas@1.0
做為選用的 HAL。由於搭載 Android 8.1 的裝置不需要實作此 HAL,因此已將下列項目新增至 compatibility_matrix.F.xml
(在這個版本的開發期間暫時命名為 compatibility_matrix.current.xml
):
<hal format="hidl" optional="true">
<name>android.hardware.cas</name>
<version>1.0</version>
<interface>
<name>IMediaCasService</name>
<instance>default</instance>
</interface>
</hal>
升級 HAL (次要)
在開發期間,當 HAL 從目前的 FCM 版本 F
從 x.z
升級至 x.(z+1)
時,如果該版本為:
- 對於使用
V = F
啟動的裝置,compatibility_matrix.F.xml
必須指出x.(z+1)
和optional="false"
。 - 對於使用
V = F
啟動的裝置,compatibility_matrix.F.xml
必須從compatibility_matrix.<F-1>.xml
複製x.y-z
和選用性,並將版本變更為x.w-(z+1)
(其中w >= y
)。
舉例來說,Android 8.1 推出了 broadcastradio@1.1
做為 1.0 HAL 的子版本升級。針對搭載 Android 8.0 的裝置,可選用舊版 broadcastradio@1.0
,而較新版本 (broadcastradio@1.1
) 則適用於搭載 Android 8.1 的裝置。在 compatibility_matrix.1.xml
中:
<hal format="hidl" optional="true">
<name>android.hardware.broadcastradio</name>
<version>1.0</version>
<interface>
<name>IBroadcastRadioFactory</name>
<instance>default</instance>
</interface>
</hal>
這個項目已複製到 compatibility_matrix.F.xml
,並依照下列方式修改:
<hal format="hidl" optional="true">
<name>android.hardware.broadcastradio</name>
<version>1.0-1</version>
<interface>
<name>IBroadcastRadioFactory</name>
<instance>default</instance>
</interface>
</hal>
升級 HAL (主要)
在開發期間,如果 HAL 有目前 FCM 版本 F
的主要版本升級,系統會將新的主要版本 x.0
新增至 compatibility_matrix.F.xml
,並採用下列 optional
設定:
- 僅包含
x.0
版本的optional="false"
(如果搭載V = F
的裝置必須使用x.0
啟動)。 optional="false"
,以及在同一個<hal>
標記中和較舊的主要版本,如果搭配V = F
隨附的裝置必須搭配此 HAL 啟動,但可以透過較舊的主要版本推出。optional="true"
(如果搭載V = F
的裝置不必啟動 HAL)。
舉例來說,Android 9 會使用 health@2.0
做為 1.0 HAL 的主要版本升級,並淘汰 1.0 HAL。舊版 (health@1.0
) 適用於搭載 Android 8.0 和 Android 8.1 的裝置。搭載 Android 9 的裝置不得提供已淘汰的 1.0 HAL,必須改為提供新的 2.0 版本。I compatibility_matrix.legacy.xml
、compatibility_matrix.1.xml
和 compatibility_matrix.2.xml
:
<hal format="hidl" optional="true">
<name>android.hardware.health</name>
<version>1.0</version>;
<interface>
<name>IHealth</name>
<instance>default</instance>
</interface>
</hal>
這個項目已複製到 compatibility_matrix.F.xml
並修改如下:
<hal format="hidl" optional="false">
<name>android.hardware.health</name>
<version>2.0</version>
<interface>
<name>IHealth</name>
<instance>default</instance>
</interface>
</hal>
限制:
- 由於 2.0 HAL 位於具有
optional="false"
的compatibility_matrix.3.xml
中,因此搭載 Android 9 的裝置必須隨附 2.0 HAL。 - 由於 1.0 HAL 不在
compatibility_matrix.3.xml
中,因此搭載 Android 9 的裝置不得提供 1.0 HAL (因為這個 HAL 被認為已淘汰)。 - 由於 1.0 HAL 存在舊版/1/2.xml (適用於 Android 9 的舊版 FCM 版本) 做為選用的 HAL,因此 Android 9 架構仍可搭配 1.0 HAL (不會被視為已移除的 HAL 版本) 運作。
新的 FCM 版本
在系統分區中發布 FCM 版本的程序,是由 Google 透過 Android 開放原始碼計畫發布的一部分完成,其中包含下列步驟:
- 請確認
compatibility_matrix.F.xml
具有level="F"
屬性。 - 請確保所有裝置已建構並啟動。
- 更新 VTS 測試,確保以最新架構 (以 Shipping API 級別為基礎) 啟動的裝置具備目標 FCM 版本
V >= F
。 - 將檔案發布到 Android 開放原始碼計畫。
舉例來說,VTS 測試會確保搭載 Android 9 的裝置具備目標 FCM 版本 >= 3。
此外,產品和 system_ext FCM 可能也會列出各個平台 FCM 版本的需求條件。產品和 system_ext 分區的 FCM 版本是由這些映像檔的擁有者分別執行。產品和 system_ext 分區上的 FCM 版本號碼必須與系統分區上的 FCM 版本號碼一致。與系統分區的 FCM 版本類似,產品中 FCM 版本 F 的相容性矩陣和 system_ext 分區,可反映目標 FCM 版本 F 的裝置需求。
HAL 版本淘汰
淘汰 HAL 版本是開發人員決定 (舉例來說,如果是 Android 開放原始碼計畫 HAL,Google 會自行做出決定)。這可能是因為發布較高的 HAL 版本 (無論是次要或主要版本)。
淘汰裝置 HAL
如果特定裝置 HAL foo@x.y
在 FCM 版本 F
淘汰,表示任何搭載目標 FCM V = F
以上版本的裝置,都不得實作 x.y
版本或 x.y
之前的任何版本。foo
升級裝置的架構仍會支援已淘汰的 HAL 版本。
FCM 版本 F
發布後,如果目標 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_表格.2.xml 中。因此 health@1.0
視為已淘汰。
淘汰架構 HAL
如果特定架構 HAL foo@x.y
在 FCM 版本 F
淘汰,表示任何搭載目標 FCM V = F
以上版本的裝置,都不得預期架構在 x.y
或 x.y
以前的任何版本提供 foo
。升級裝置的架構仍會提供已淘汰的 HAL 版本。
發布 FCM 版本 F
時,如果架構資訊清單為 foo@x.y
指定 max-level="F - 1"
,系統會將 HAL 版本 foo@x.y
視為已淘汰。如果裝置搭配 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
的有效裝置降至特定門檻以下時,目標 FCM 版本會從下一個架構版本的組合 SF 中移除。此作業由下列兩個步驟完成:
從建構規則中移除
compatibility_matrix.V.xml
(使其不會安裝在系統映像檔上),並刪除任何實作或依賴已移除功能的程式碼。從架構資訊清單移除
max-level
低於或等於V
的架構 HAL,並刪除任何實作已移除架構 HAL 的程式碼。
如果裝置的特定架構版本目標 FCM 版本不在 SF 內,就無法升級至該版本。
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 版本位於公開的凍結相容性矩陣,其中包含 HAL 版本最高的 FCM 版本 (亦即未淘汰)。舉例來說,繼續存在於 compatibility_matrix.3.xml
中的現有 HAL 版本 (例如 compatibility_matrix.legacy.xml
中引入的 nfc@1.0
) 也會視為已發布的 HAL 版本。
針對架構 HAL,如果 HAL 版本位於不含 max-level
屬性的最新分支版本架構資訊清單中,或是 (通常) 等於或高於此分支版本中發布的 FCM 版本,系統會將 HAL 版本視為已發布且目前的 HAL 版本。max-level
舉例來說,displayservice
HAL 已在 Android 12 中發布,且已根據 Android 12 架構資訊清單指定。
已發布但已淘汰
對於裝置 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 中視為已淘汰。- Power HAL 在 Android 9 中有次要版本升級,但
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
。
因此,在 Android 9 中,power@1.0
目前為,但「未」淘汰。
針對架構 HAL,如果 HAL 版本位於最新發布分支版本的架構資訊清單中,且 max-level
屬性低於此分支版本中的 FCM 版本,則系統會將其視為已釋出但已淘汰的 HAL 版本。舉例來說,schedulerservice
HAL 已經發布,但在 Android 12 中已淘汰 (如 Android 12 架構資訊清單指定)。
已移除
對於裝置 HAL,只有符合下列條件時,系統才會移除 HAL 版本:
- 先前已發布。
- 不在架構支援的任何公開和凍結相容性矩陣中。
只有公開、凍結但不受架構支援的相容性矩陣會保留在程式碼集中,用於定義已移除的 HAL 版本組合,以便寫入 VTS 測試,確保在新裝置中不會出現已移除的 HAL。
架構 HAL 必須符合下列條件,系統才會移除 HAL 版本:
- 先前已發布。
- 不包含在最新發布分支版本的任何架構資訊清單中。
舊版 FCM
針對所有非 Treble 裝置,目標 FCM 版本都是特殊的值。舊版 FCM compatibility_matrix.legacy.xml
列出了舊版裝置上的架構要求 (例如 Android 8.0 以下版本的裝置)。
如果 F
版本的 FCM 有這個檔案,只要裝置資訊清單與這個檔案相容,任何非 Treble 裝置都能升級至 F
。移除作業的程序與其他目標 FCM 版本的 FCM 相同 (在有效裝置數量降到 8.0 之前的裝置數量降到特定門檻以下後移除)。
已發布的 FCM 版本
您可以在 hardware/interfaces/compatibility_matrices
下方找到已發布的 FCM 版本清單。
如要尋找特定 Android 版本發布的 FCM 版本,請參閱 Level.h
。