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,在本文件中省略)。
裝置資訊清單
XML 檔案,用於指定供應商介面的裝置端 (包括供應商和 ODM 映像檔) 提供哪些 HAL 版本。裝置資訊清單的內容受到裝置目標 FCM 版本的限制,但可以列出與 V 對應 FC 相對較新的 HAL。
裝置 HAL
在裝置資訊清單中列出的 HAL (提供),以及在架構相容性矩陣 (FCM) 中列出的 HAL (必要或選用)。
裝置相容性矩陣 (DCM)
XML 檔案,可指定相容架構實作項目的供應商需求。每部裝置都包含一個 DCM。
Framework 資訊清單
XML 檔案,用於指定供應商介面的架構端提供哪些 HAL 版本,包括系統、system_ext 和產品映像檔。框架資訊清單中的 HAL 會根據裝置的指定 FCM 版本,以動態方式停用。
架構 HAL
在架構資訊清單中列為提供的 HAL,並在裝置相容性矩陣 (DCM) 中列為必要或選用的 HAL。

程式碼集中的 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

FCM 級別與供應商 API 級別相同或更新。

Android 淘汰 FCM 級別時,仍會支援現有裝置。只要分支中提供新版 FCM 層級的 HAL,鎖定較低 FCM 層級的裝置就會隱含允許使用這些 HAL。

在新版 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

  • optional="false" 如果搭載 V = F 的裝置必須透過此 HAL 啟動,
  • optional="true" 如果搭載 V = F 的裝置可以在沒有這個 HAL 的情況下啟動。

舉例來說,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"
  • compatibility_matrix.F.xml 必須從 compatibility_matrix.<F-1>.xml 複製 x.y-z 和選用項目,並將版本變更為 x.w-(z+1) (w >= y)。此方法不適用於以 V = F 啟動的裝置。

舉例來說,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 會透過以下 optional 設定新增至 compatibility_matrix.F.xml

  • 如果搭載 V = F 的裝置必須使用 x.0 啟動,則使用僅包含 x.0 版本的 optional="false"
  • optional="false",但也與相同 <hal> 標記中的舊主要版本搭配使用,如果搭載 V = F 的裝置必須使用此 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 的裝置必須提供新的 2.0 版本。舉例來說,假設 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 位於 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 版本中執行,包括下列步驟:

  1. 請確認 compatibility_matrix.F.xml 具有 level="F" 屬性。
  2. 確認所有裝置都已建構及啟動。
  3. 更新 VTS 測試,確保使用最新架構 (根據發布 API 級別) 啟動的裝置,具有目標 FCM 版本 V >= F
  4. 將檔案發布至 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 以上版本的裝置,都不得實作 x.y 版本或 x.y 之前的任何版本。foo升級裝置的架構仍支援已淘汰的 HAL 版本。

當 Firebase 雲端消息版本 F 發布時,如果最新的 Firebase 雲端消息版本 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_matrix.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 中移除。這項操作會同時執行下列兩個步驟:

  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 版本位於公開且已凍結的相容性矩陣中,且該矩陣具有最高的 FCM 版本,則 HAL 版本為最新版本 (即未淘汰)。舉例來說,如果現有的 HAL 版本 (例如 compatibility_matrix.legacy.xml 中引入的 nfc@1.0) 仍存在於 compatibility_matrix.3.xml 中,也會視為已發布的現有 HAL 版本。

針對架構 HAL,如果 HAL 版本位於最新發布分支的架構資訊清單中,且沒有 max-level 屬性,或 (不尋常地) max-level 等於或高於這個分支發布的 FCM 版本,則系統會將其視為已發布的目前 HAL 版本。舉例來說,displayservice HAL 已在 Android 12 中發布並更新,如 Android 12 架構資訊清單所述。

已發布但已淘汰

對於裝置 HAL 來說,只有在符合下列所有條件時,HAL 版本才會淘汰:

  • 已發布。
  • 它不在 FCM 最高版本的公開和凍結相容性矩陣中。
  • 這個版本位於架構仍支援的公開且已凍結的相容性矩陣中。

例如:

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

針對所有非 Treble 裝置,Target FCM Version legacy 是特殊值。舊版 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