產品設定會封裝一組套件和元件,用於支援基礎硬體上的目標使用者體驗。每項產品設定都會在 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 軟體時,測試程式碼的步驟如下:
- 建構更新後的套件,並納入所有程式碼變更。
- 將更新後的套件發布至 Package Repository。
- 在目標裝置上觸發更新。
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重新啟動模擬器
執行下列指令,關閉目前開啟的所有模擬器執行個體:
ffx emu stop --all啟動新的模擬器執行個體:
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 建構了自己的自訂產品!