產品套件

產品設定會封裝一組必要的套件和元件,以支援基礎硬體上的目標使用者體驗。每項產品設定都會在 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 觸發系統更新,或在裝置上刷新系統映像檔以更新基本套件。
  • 下次解析套件時,快取和宇宙套件會自動更新。

運動:自訂版本

在本練習中,您將暫時在宇宙套件組合中納入其他套件,藉此自訂 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 建構了自訂產品!