產品套件

產品設定會封裝一組套件和元件,以支援基礎硬體上的目標使用者體驗。每個產品設定都會在 GN 匯入 (.gni) 檔案中,使用 GN 標籤宣告預設的套件清單。您可以透過幾種不同方式擴增目前建構設定的內容。

依附元件集

建構設定中的套件會指派給下列其中一組依附元件:

  • 基礎:與系統映像檔綁定的系統重要套件。即使套件存放區提供不同版本,基礎套件一律會解析為系統映像檔中的版本。更新基礎套件需要進行系統 (OTA) 更新。
  • 快取:與系統映像檔綁定的其他套件。如有不同版本,系統會從套件存放區更新快取套件。
  • 宇宙:其他所有內容。這組套件僅透過套件存放區提供,並依需求交付。

這張圖表顯示套件在建構設定的基礎、快取或通用依附元件集中。這個集合會決定如何解析套件的新版本。

以下是產品設定檔的範例程式碼片段。這個產品會繼承 core 產品中定義的所有套件,然後在每個依附元件集中新增幾個額外套件:

import("//products/core.gni")

legacy_base_package_labels += [
  "//src/chromium:web_engine",
  "//src/fonts",
]

legacy_cache_package_labels += [
  "//src/media/playback/bundles:services",
]

discoverable_package_labels += [
  "//src/ui/examples:bouncing_ball",
]

在本範例中,建構系統會將執行階段、資源和服務封裝至目標裝置的磁碟映像檔。範例只會透過套件伺服器隨選提供。

手動自訂建構作業

建立完整的新產品設定並非自訂建構作業的唯一方法。您也可以使用下列標記,透過 fx set 指令提供額外標籤:

  • --with:將目標標籤新增至宇宙依附元件集。
  • --with-base:將目標標籤新增至基本依附元件集。
  • --with-cache:將目標標籤新增至快取依附元件集。

這是暫時啟用開發套件的好方法,您不想將這些套件納入最終建構目標 (例如測試)。舉例來說,下列指令會將 Fuchsia tests 套件中的所有套件新增至標準 workstation_eng 建構作業。

fx set workstation_eng.x64 --with //bundles/tests

使用套件進行開發

請回想一下簡介中的內容,Fuchsia 套件不會「安裝」到裝置上,而是從本機套件快取或套件存放區解析。開發 Fuchsia 軟體時,這表示測試程式碼需要執行下列步驟:

  1. 使用任何程式碼變更建構更新的套件。
  2. 將更新後的套件發布至套件存放區。
  3. 在目標裝置上觸發更新。

這張圖表顯示開發人員工具在開發期間如何將套件發布至 TUF 存放區,並通知 Fuchsia 裝置解析最新版本。

開發人員工具,例如在建構程序中,將套件更新發布至本機套件存放區。fx build產品宣告套件的依附元件集會決定如何在目標裝置上觸發更新:

  • 如要更新基礎套件,只能執行完整的系統更新 (OTA)。使用 fx ota 觸發系統更新,或在裝置上刷入新的系統映像檔,即可更新基礎套件。
  • 下次解析套件時,系統會自動更新快取和 Universe 套件。

練習:自訂建構作業

在本練習中,您將暫時在 Universe 套件集中加入其他套件,藉此自訂 workstation_eng 建構作業,讓目標裝置可以使用這些套件。

在建構作業中新增套件

您可以使用 fx set--with 標記,將其他目標與建構設定組合在一起。重新設定 workstation_eng 建構作業,納入所有 Fuchsia 範例:

fx set workstation_eng.x64 --with //examples

這通常用於納入需要在裝置上執行的測試套件,或是您正在開發的新套件,但該套件尚未納入產品設定。

確認範例套件已新增至建構:

fx list-packages example

使用 GN 探索建構目標

GN 隨附一組強大的診斷工具,可供您檢查建構作業中設定的目標。請按照說明操作,瞭解如何使用 fx gn 子指令探索建構目標。

首先,請使用 desc 指令列印您剛才新增至建構作業的 //examples 套件詳細資料。

fx gn desc out/default //examples

這項指令會輸出目標類型及其所有依附元件的詳細資料。對於 //examples 組合包,依附元件清單代表新增至建構作業的個別範例套件。

使用相同指令探索 hello-world 目標的詳細資料。

fx gn desc out/default //examples/hello_world:hello-world

這個目標代表包含多個元件套件,因此您會看到其他依附元件,例如元件資訊清單和套件中繼資料。

再往下一個層級,探索 hello-world-rust 元件。

fx gn desc out/default //examples/hello_world/rust:hello-world-rust-component

從特定目標 (例如 hello-world-rust 元件) 的角度來看,您也可以使用 refs 指令在建構圖中向上查看。這會回報指定目標的傳入參照。

fx gn refs out/default //examples/hello_world/rust:hello-world-rust-component

最後,使用 path 指令回報任意兩個目標之間的參照鏈結。這有助於判斷目標在建構作業中的納入位置和方式,方法是檢查目標和 //:default 之間的參照路徑。

fx gn path out/default //:default //examples/hello_world:hello-world

在模擬器中執行範例

再次執行 fx build,建構更新後的套件:

fx build

使用 ffx component 指令執行 Hello World 元件範例:

ffx component run /core/ffx-laboratory:hello-world-cpp fuchsia-pkg://fuchsia.com/hello-world-cpp#meta/hello-world-cpp.cm

開啟新的終端機視窗,然後篩選裝置記錄,找出來自 範例的訊息:

ffx log --filter hello

裝置記錄中應會顯示下列輸出內容:

[hello-world-cpp][I] Hello, World!

練習:建立新的建構產品

在下一個練習中,您會將這些額外套件封裝到新的產品設定中,並擴充 workstation_eng

宣告產品設定

//vendor 下方建立名為 fuchsia-codelab 的新目錄:

mkdir -p vendor/fuchsia-codelab

//vendor/fuchsia-codelab/products 下方建立名為 fuchsialab.gni 的新檔案,並加入下列內容:

# Extend the workstation_eng product
import("//products/workstation_eng.gni")

這會建立名為 fuchsialab 的新產品,並擴充 workstation_eng,繼承定義的所有套件標籤。

使用 fx list-products 指令,確認建構系統是否能辨識新產品。產品清單中應會顯示 fuchsialab

fx list-products

在產品中新增套裝組合

如要自訂產品隨附的特定套件,請將這些套件新增至產品設定中適當套件組合的標籤。

//vendor/fuchsia-codelab/products/fuchsialab.gni 中新增下列程式碼,將 Hello World 範例納入自訂產品:

discoverable_package_labels += [
    "//examples/hello_world",
]

打造新產品

重新設定在 FEMU 板上執行的 fuchsialab 產品建構作業:

fx set fuchsialab.x64

確認 Hello World 範例套件現在已是建構作業的一部分:

fx list-packages hello

執行 fx build,為自訂產品生成新圖片:

fx build

重新啟動模擬器

  1. 執行下列指令,關閉目前開啟的所有模擬器執行個體:

    ffx emu stop --all
  2. 啟動新的模擬器執行個體:

    ffx emu start --headless

    啟動完成後,模擬器會輸出下列訊息並傳回:

    Logging to "$HOME/.local/share/Fuchsia/ffx/emu/instances/fuchsia-emulator/emulator.log"
    Waiting for Fuchsia to start (up to 60 seconds)........
    Emulator is ready.
    

檢查裝置

開啟另一個終端機視窗,然後執行下列指令,列印裝置目標的詳細資料:

ffx target show

尋找目標輸出的建構設定:

Version: "2000-01-01T12:00:00+00:00"
Product: "fuchsialab"
Board: "x64"
Commit: "2000-01-01T12:00:00+00:00"

恭喜!您剛才根據 Fuchsia 打造了專屬的自訂產品!