產品設定會封裝一組必要的套件和元件,以支援基礎硬體上的目標使用者體驗。每項產品設定都會在 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 軟體時,測試程式碼涉及以下步驟:
- 使用任何程式碼變更建構更新後的套件。
- 將更新過的套件發布至套件存放區。
- 在目標裝置上觸發更新。
在建構程序中,開發人員工具 (例如 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
重新啟動模擬器
執行下列指令,關閉目前開啟的所有模擬器執行個體:
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 建構了自訂產品!