本程式碼研究室會逐步說明如何使用 Bazel 建構系統,在 Fuchsia 中定義新產品設定。產品設定用於指定構成 Fuchsia 產品的軟體功能、設定和套件,與執行的硬體無關。
必要條件
- 熟悉 Fuchsia 的軟體組裝概念。
- 對 Bazel 建構規則有基本瞭解。
什麼是產品設定?
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
後續步驟
本程式碼研究室介紹了定義新產品設定的基本知識。
如要繼續學習,請參閱下列文章:
- 在
//products中查看現有產品設定。 - 進一步瞭解看板設定。