程式碼研究室:定義新的產品設定

本程式碼研究室會逐步說明如何使用 Bazel 建構系統,在 Fuchsia 中定義新產品設定。產品設定用於指定構成 Fuchsia 產品的軟體功能、設定和套件,與執行的硬體無關。

必要條件

什麼是產品設定?

Fuchsia 中的產品設定會定義特定產品的使用者體驗。這與主機板設定不同,主機板設定會指定硬體專屬詳細資料。產品設定通常包括:

  • 平台設定:基礎 Fuchsia 作業系統的設定 (例如建構類型、已啟用的系統功能)。
  • 產品設定:產品體驗專屬設定 (例如工作階段殼層、特定套件)。

產品設定是使用 BUILD.bazel 檔案中的 fuchsia_product_configuration 規則定義。

撰寫產品設定

我們來瞭解如何定義產品設定,並使用該設定建構系統映像檔。

基本設定

產品設定主要為傳遞至 fuchsia_product_configuration 規則的 JSON 物件 (以 Starlark 中的字典表示)。

# //products/my_product/BUILD.bazel
load(
    "@rules_fuchsia//fuchsia:assembly.bzl",
    "fuchsia_product_configuration",
)

fuchsia_product_configuration(
    name = "product_config",
    product_config_json = {
        "platform": {
            "build_type": "eng",
            "feature_set_level": "standard",
        },
        "product": {},
    },
)

平台設定

設定字典中的 platform 鍵可控管 Fuchsia 系統的各個層面。常見的欄位包括:

  • build_type:控制安全性和最佳化等級。
    • eng:工程建構版本。這個版本最適合用於偵錯,因為已啟用斷言,並停用最佳化功能。
    • userdebug:這個版本經過最佳化,與 user 版本類似,但啟用了一些偵錯功能和工具。
    • user:正式版建構作業。這個版本經過全面最佳化,安全無虞。
  • feature_set_level:定義系統中包含的基準功能集。
    • embeddable:bootstrap 的最小子集。這個版本經過最佳化,可適用於記憶體受限的環境,且不會自動更新。
    • bootstrap:可啟動,僅限序號。僅限 /bootstrap 領域。沒有 netstack 或儲存空間驅動程式。主要用於板級啟動。
    • utility:最小設定,包含 /core 領域。適用於復原等公用程式類型的系統。
    • standard:完整的 Fuchsia 設定。包括 Netstack 和自我更新功能。此為預設值。
  • storage:設定檔案系統 (例如 Fxfs) 和儲存空間配置。

如需完整的平台設定清單,請參閱 PlatformSettings 說明文件

舉例來說,具有平台設定的 Fuchsia 產品設定可能如下所示:

fuchsia_product_configuration(
    name = "product_config",
    product_config_json = {

        "platform": {
            "build_type": "eng",
            "feature_set_level": "standard",
            "storage": {
                "filesystems": {
                    "volume": {
                        "fxfs": {},
                    },
                },
            },
        },
        "product": {},

    },
)

產品設定

product 鍵用於較高層級的產品設定。

其中最重要的設定是工作階段。工作階段是頂層元件,可定義產品的使用者體驗 (例如圖形介面或主要應用程式)。

如要使用工作階段,您必須指定其網址,並確保包含元件的套件已納入基本套件

基礎套件是系統映像檔中包含的一組套件。這些屬性會在開機時立即提供,且不可變更 (唯讀),並會隨著系統 OTA 更新。

舉例來說,含有產品設定的 Fuchsia 產品設定可能如下所示:

範例:

fuchsia_product_configuration(
    name = "product_config",
    product_config_json = {
        "platform": {
            "build_type": "eng",
            "feature_set_level": "standard",
        },

        "product": {
            "session": {
                "url": "fuchsia-pkg://fuchsia.com/my_session#meta/my_session.cm",
            },
        },
    },
    base_packages = [
        "//src/my_session:my_session_package",
    ],

)

如需完整的產品設定清單,請參閱 ProductSettings 說明文件

組裝產品圖片

取得 fuchsia_product_configuration 後,您可以使用 fuchsia_product 規則組裝最終的系統映像檔。這項規則會將產品設定與特定開發板設定合併。

load(
    "@rules_fuchsia//fuchsia:assembly.bzl",
    "fuchsia_product",
)

fuchsia_product(
    name = "image.x64",
    board_config = "//boards:x64",
    platform_artifacts = "//build/bazel/assembly/assembly_input_bundles:platform_eng",

    product_config = ":product_config",

)
  • board_config:指向開發板設定目標。
  • platform_artifacts:指向要使用的平台構件 (AIB) 組合。

建立產品組合

如要在裝置或模擬器上執行產品,您需要使用 fuchsia_product_bundle 規則將產品套件至產品組合。

load(
    "@rules_fuchsia//fuchsia:assembly.bzl",
    "fuchsia_product_bundle",
)

fuchsia_product_bundle(
    name = "product_bundle.x64",
    product_bundle_name = "my_product.x64",

    main = ":image.x64",

)

這個目標會產生 ffx product-bundle 指令所需的構件。

例如:

  • 在模擬器中執行:

    ffx emu start my_product.x64
    
  • 將韌體刷入裝置:

    ffx target flash -b my_product.x64
    

後續步驟

本程式碼研究室介紹了定義新產品設定的基本知識。

如要繼續學習,請參閱下列文章: