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 版本的格式為
foo@xy
,其中foo
是 HAL 名稱,xy
是特定版本;例如nfc@1.0
、keymaster@3.0
(根前綴,例如android.hardware
,在本文檔中被省略。) - 設備清單
- XML 文件,指定供應商介面的設備端(包括供應商和 ODM 映像)提供的 HAL 版本。設備清單的內容受設備的目標 FCM 版本限制,但可以列出相對於 V 對應的 FC 嚴格較新的 HAL。
- 設備 HAL
- 設備清單中列出(提供)以及框架相容性矩陣 (FCM) 中列出(必需或可選)的 HAL。
- 設備相容性矩陣 (DCM)
- 一個 XML 文件,指定供應商對符合框架實現的要求。每個設備包含一個 DCM。
- 框架清單
- 一個 XML 文件,指定供應商介面的框架端提供的 HAL 版本,包括系統、system_ext 和產品映像。框架清單中的 HAL 根據裝置的目標 FCM 版本動態停用。
- 框架 HAL
- HAL 按框架清單中提供的方式列出,並在裝置相容性矩陣 (DCM) 中列為必需或可選。
程式碼庫中的 FCM 生命週期
本文檔抽像地描述了 FCM 生命週期。若要查看目前支援的清單,請參閱hardware/interfaces/compatibility_matrix.<FCM>.xml
,其中 FCM 可以在system/libvintf/include/vintf/Level.h
中找到。
從 Android 14 開始,支援的等級為:
流式細胞儀 | 安卓版本 |
---|---|
4 | 安卓10/Q |
5 | 安卓11/R |
6 | 安卓12/S |
7 | 安卓13/T |
8 | 安卓14/U |
在新的 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
上進行從xz
到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
複製xy-z
和可選性,並將版本變更為xw-(z+1)
(其中w >= y
。
例如,Android 8.1引入了broadcastradio@1.1
作為1.0 HAL的小型版本升級。對於使用 Android 8.0 啟動的裝置來說,較舊的版本broadcastradio@1.0
是可選的,而對於使用 Android 8.1 啟動的裝置來說,較新的版本broadcastradio@1.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
設定:
- 如果使用
V = F
裝置必須使用x.0
啟動,則僅使用版本x.0
的optional="false"
。 - 如果
V = F
附帶的裝置必須使用此 HAL 啟動,但可以使用舊的主要版本啟動,則可選optional="false"
,但與同一<hal>
標記中的舊主要版本一起啟動。 - 如果
V = F
附帶的設備不必啟動 HAL,則optional="true"
。
例如,Android 9 引入health@2.0
作為 1.0 HAL 的主要版本升級,並棄用 1.0 HAL。對於搭載 Android 8.0 和 Android 8.1 的設備,舊版health@1.0
是可選的。使用 Android 9 啟動的裝置不得提供已棄用的 1.0 HAL,而必須提供新的 2.0 版本。我的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 位於
compatibility_matrix.3.xml
中,且附有optional="false"
,因此使用 Android 9 啟動的裝置必須附帶 2.0 HAL。 - 由於 1.0 HAL 不在
compatibility_matrix.3.xml
中,因此使用 Android 9 啟動的裝置不得提供 1.0 HAL(因為此 HAL 已被視為已棄用)。 - 由於 1.0 HAL 作為可選 HAL 存在於 Legacy/1/2.xml(Android 9 可以使用的舊版 FCM 版本)中,因此 Android 9 框架仍然可以使用 1.0 HAL(不被視為已刪除的 HAL 版本) )。
新的 FCM 版本
在系統分割區上發布 FCM 版本的過程由 Google 作為 AOSP 版本的一部分單獨完成,包括以下步驟:
- 確保
compatibility_matrix.F.xml
具有屬性level="F"
。 - 確保所有設備建置並啟動。
- 更新 VTS 測試,確保使用最新框架(基於 Shipping 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@xy
在 FCM 版本F
中被棄用時,這意味著使用目標 FCM 版本V = F
或更高版本啟動的任何設備不得在版本xy
或任何早於xy
的版本上實現foo
。升級設備的框架仍然支援已棄用的 HAL 版本。
發布 FCM 版本F
時,如果目標 FCM 版本V = F
的最新 FCM 中未明確說明特定的 HAL 版本,則 HAL 版本foo@xy
將被視為已棄用。對於以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@xy
在 FCM 版本F
中被棄用時,這意味著使用目標 FCM 版本V = F
或更高版本啟動的任何設備都不得期望框架提供版本xy
或任何早於xy
的版本的foo
。框架仍提供已棄用的 HAL 版本用於升級設備。
當 FCM 版本F
發佈時,如果框架清單為foo@xy
指定max-level=" F - 1 "
則 HAL 版本foo@xy
將被視為已棄用。對於使用V = F
啟動的設備,框架不提供 HAL foo@xy
。以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 版本在 S F之外的裝置無法升級到該版本。
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 被凍結並發佈到 AOSP 後, health@2.0
HAL 被視為已發布的當前 HAL 版本。
如果 HAL 版本位於具有最高 FCM 版本的公開且凍結的相容性矩陣中,則 HAL 版本是最新版本(即未棄用)。例如,現有的 HAL 版本(例如在compatibility_matrix.legacy.xml
中引入的nfc@1.0
繼續存在於compatibility_matrix.3.xml
中也被視為已發布的目前 HAL 版本。
對於框架 HAL,如果 HAL 版本位於最新發布分支的框架清單中,但沒有max-level
屬性,或(通常) max-level
等於或高於此分支中發布的 FCM 版本,則將其視為已發布和當前的HAL 版本。例如,根據Android 12 框架清單 的指定, displayservice
HAL 已在 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.2.xml
compatibility_matrix.1.xml
和compatibility_matrix.legacy.xml
。 -
compatibility_matrix.3.xml
具有power@1.0-1
。
因此, power@1.0
在 Android 9 中是最新的,但並未棄用。
對於框架 HAL,如果 HAL 版本位於最新發布分支的框架清單中,且max-level
屬性低於該分支中的 FCM 版本版本,則將其視為已發布但已棄用的 HAL 版本。例如, schedulerservice
HAL 已發布,但在 Android 12 中已棄用,如Android 12 框架清單所指定。
已刪除
對於設備 HAL,當且僅當滿足以下條件時,才會刪除 HAL 版本:
- 此前已發布。
- 它不在框架支援的任何公共和凍結的兼容性矩陣中。
公開的、凍結的、但框架不支援的相容性矩陣保留在程式碼庫中,以定義已刪除的 HAL 版本集,以便可以編寫 VTS 測試以確保已刪除的 HAL 不在新裝置上。
對於框架 HAL,當且僅在滿足以下條件時才會刪除 HAL 版本:
- 此前已發布。
- 它不在最新發布分支的任何框架清單中。
舊版 FCM
目標 FCM 版本舊版對於所有非 Treble 設備來說是一個特殊值。舊版 FCM compatibility_matrix.legacy.xml
列出了舊版裝置(即 Android 8.0 之前啟動的裝置)上框架的要求。
如果版本F
的 FCM 存在此文件,則任何非 Treble 設備都可以升級到F
,前提是其設備清單與此文件相容。其刪除過程與其他目標 FCM 版本的 FCM 相同(在 8.0 之前的活動設備數量降至特定閾值以下後刪除)。
發布的 FCM 版本
已發布的 FCM 版本清單可以在hardware/interfaces/compatibility_matrices
下找到。
若要尋找隨特定 Android 版本一起發布的 FCM 版本,請參閱Level.h
。