產品套件

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

依附元件集

建構設定中的套件會指派至下列三個依附元件組合之一:

  • Base:系統映像檔中隨附的系統關鍵套件。基本套件一律會解析為系統映像檔中的版本,即使 Package Repository 提供其他版本也一樣。如要更新基本套件,則需要系統 (OTA) 更新。
  • 快取:系統映像檔中額外隨附的套件。如果有其他版本,系統會從 Package Repository 更新快取的套件。
  • 宇宙:其他所有事物。這組套件只能透過 Package Repository 取得,並依需求提供。

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

以下是產品設定檔的程式碼片段範例。這項產品會沿用 core 產品中定義的所有套件,然後在每個依附元件組合中新增一些額外套件:

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

legacy_base_package_labels += [
  "//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 套件不會「安裝」到裝置上,而是從本機套件快取或 Package Repository解析。開發 Fuchsia 軟體時,測試程式碼的步驟如下:

  1. 建構更新後的套件,並納入所有程式碼變更。
  2. 將更新後的套件發布至 Package Repository。
  3. 在目標裝置上觸發更新。

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

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

  • 基本套件只能透過執行整個系統更新 (OTA) 來更新。使用 fx ota 觸發系統更新,或在裝置上刷新新的系統映像檔,以更新基礎套件。
  • 下次解析套件時,快取和通用套件會自動更新。

練習:自訂建構作業

在本練習中,您將自訂 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",
]

打造新產品

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

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 建構了自己的自訂產品!