FCM 生命週期

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.0keymaster@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 開始開發:

  1. 將最新的 compatibility_matrix.<F-1>.xml 複製到 compatibility_matrix.F.xml
  2. 將檔案中的 level 屬性更新為 F
  3. 新增對應的建構規則,將這個相容性矩陣安裝至裝置。

隆重推出新的 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 版本 Fx.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.xmlcompatibility_matrix.1.xmlcompatibility_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 開放原始碼計畫發布的一部分完成,其中包含下列步驟:

  1. 請確認 compatibility_matrix.F.xml 具有 level="F" 屬性。
  2. 請確保所有裝置已建構並啟動。
  3. 更新 VTS 測試,確保以最新架構 (以 Shipping API 級別為基礎) 啟動的裝置具備目標 FCM 版本 V >= F
  4. 將檔案發布到 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.xmlcompatibility_matrix.1.xmlcompatibility_表格.2.xml 中。因此 health@1.0 視為已淘汰。

淘汰架構 HAL

如果特定架構 HAL foo@x.y 在 FCM 版本 F 淘汰,表示任何搭載目標 FCM V = F 以上版本的裝置,都不得預期架構在 x.yx.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 中移除。此作業由下列兩個步驟完成:

  1. 從建構規則中移除 compatibility_matrix.V.xml (使其不會安裝在系統映像檔上),並刪除任何實作或依賴已移除功能的程式碼。

  2. 從架構資訊清單移除 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 最高版本的公開和凍結相容性矩陣中。
  • 這個矩陣是架構仍支援的公開且凍結相容性矩陣,

例如:

因此,在 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