系統中的所有元件都會組合成根元件例項樹狀結構。樹狀結構中的父項元件負責 宣告其他元件的例項做為其子項,並提供其子項 並介紹一些相關功能同時,子項元件也可以將功能公開回傳至父項。這些元件執行個體和能力關係 元件拓撲。
任何父項元件及其所有子項都會在樹狀結構中形成一個稱為「realm」的群組。運作範圍可讓家長控管要流入哪些能力 從元件的子樹狀結構中產生一個能力邊界。這個 封裝可讓領域在內部重組,而不影響實際運作 必須依賴其所公開的功能
在上圖中,fuchsia.example.Foo
的通訊協定能力會轉送
從供應器到用戶端的元件執行個體樹狀結構元件會使用 use
關鍵字宣告「需要」的功能:
{
// Information about the program to run.
program: {
// Use the built-in ELF runner to run core binaries.
runner: "elf",
// The binary to run for this component.
binary: "bin/client",
},
// Capabilities required by this component.
use: [
{ protocol: "fuchsia.example.Foo" },
],
}
元件會宣告自己實作的功能,或使用 提供
元件資訊清單的 capabilities
部分。如此一來
與元件架構相關聯的供應器請參閱下列provider.cml
範例:
{
// Information about the program to run.
program: {
// Use the built-in ELF runner to run core binaries.
runner: "elf",
// The binary to run for this component.
binary: "bin/provider",
},
// Capabilities provided by this component.
capabilities: [
{ protocol: "fuchsia.example.Foo" },
],
// Capabilities routed through this component.
expose: [
{
protocol: "fuchsia.example.Foo",
from: "self",
},
],
}
expose
關鍵字向其他元件提供該元件的能力
運作範圍,其中可能也包含
個別元件的子項在本例中,能力的來源是 self
,因為這個元件是提供者。
父項元件會控制位址空間中的能力路由,建立從用戶端元件到提供者的明確路徑。請參閱以下資訊
parent.cml
資訊清單範例:
{
children: [
{
name: "provider",
url: "fuchsia-pkg://fuchsia.com/foo-package#meta/provider.cm",
},
{
name: "client",
url: "fuchsia-pkg://fuchsia.com/foo-package#meta/client.cm",
},
],
offer: [
{
protocol: "fuchsia.example.Foo",
from: "#provider",
to: [ "#client" ],
},
],
}
父項元件會在領域中宣告一組子項元件
使用 offer
關鍵字,將功能轉送至這些人員。這樣一來
會決定每個子項能力的範圍和來源。這也
讓拓撲中的多個元件提供相同的能力
因此元件架構必須使用明確路徑
以及每個用戶端發出的要求
功能類型
Fuchsia 元件支援許多不同類型的功能。截至目前為止
這些範例展示了兩種不同的能力類型:runner
和
protocol
。您可能已經注意到,protocol
能力需要
轉送路徑,但 runner
能力則不會。
某些功能會由父項明確轉送至元件,而 提供的元件會經由「相同領域」中的所有元件提供 環境。環境可讓架構為不必明確依元件個別路由的功能進行佈建。根據預設 元件會繼承父項的環境此外,您也可以宣告 打造了全新的環境
下表列出元件可用的能力類型。 以及這些變數是否必須明確從父項元件 環境:
類型 | 說明 | 提供者 |
---|---|---|
directory
|
其他元件提供的共用檔案系統目錄。 | 路線 |
event
|
元件管理工具產生的事件,例如元件啟動或功能要求。 | 路線 |
protocol
|
其他元件或架構提供的 FIDL 通訊協定。 | 路線 |
resolver
|
這個元件可以解析為元件資訊清單的網址。 | 環境 |
runner
|
用來執行特定元件的執行階段。 | 環境 |
service
|
執行常見工作的相關 FIDL 通訊協定的已命名群組。 | 路由 |
storage
|
每個元件專屬的隔離檔案系統目錄。 | 路線 |
識別元件
透過網址來識別元件。該架構會將元件網址解析為 藉助元件解析器來宣告元件宣告。解析器為 元件本身,能夠處理特定網址配置 擷取元件資訊清單、程式和資產。
多數元件都會在 Fuchsia 套件中發布,因此元件網址是 這是對該套件中元件資訊清單的參照。請參閱以下範例:
fuchsia-pkg://fuchsia.com/foo-package#meta/foo-component.cm
元件執行個體是透過拓撲路徑參照來識別,稱為
moniker。元件的路徑名稱會指出其在元件中的位置
做為絕對或相對路徑舉例來說,別名路徑 /core/system-updater
是指 core
領域中存在的 system-updater
例項。
元件生命週期
新增及移除元件執行個體時,系統會建立及刪除元件執行個體 加入元件拓撲這可能發生在下列兩種情況:
- 靜態:執行個體在元件資訊清單中宣告為子項 其他元件的結構靜態元件只會建立 在更新變更元件拓撲時刪除。
- 動態:在元件
collection
中新增或移除執行個體 在執行階段使用fuchsia.component.Realm
通訊協定動態元件是 會在系統關閉時刪除。
元件刪除後,架構會移除其持續性狀態 (例如本機儲存空間)。
當另一個元件嘗試執行以下動作時,架構會啟動一個元件執行個體 開啟頻道連線至元件公開的功能時,會隱含發生這種情況。連線至元件 執行個體啟動後,會重複使用執行中的執行個體。
元件可以藉由退出程式 (由
元件的 runner
),或者架構可能會停止執行該元件,以供執行
像是系統關機
練習:整合元件
元件必須存在於使用中,才能叫用元件
元件拓撲在本練習中,您需要將元件加入
ffx-laboratory
:內部用於開發的受限集合
評估產品在核心運作範圍方面的表現。透過集合,您可以動態調整元件
卻會遭到系統刪除
啟動模擬器
如果您尚未啟動執行個體,請啟動支援網路功能的 FEMU:
ffx emu start workstation_eng.x64 --headless
發布套件
回想軟體推送 ,讓 Fuchsia 裝置視需要解析套件存放區中的軟體套件。
使用 bazel run
指令建構並發布 echo
元件套件:
bazel run //fuchsia-codelab/echo:pkg.publish -- \
--repo_name fuchsiasamples.com
這個指令會將套件發布至名為 fuchsiasamples.com
的存放區。
建立存放區 (如果存放區不存在),並向目標註冊該存放區。
新增至元件拓撲
使用下列指令建立 echo
元件的新執行個體:
ffx component create /core/ffx-laboratory:echo \
fuchsia-pkg://fuchsiasamples.com/echo-example#meta/echo.cm
這項指令可接受兩個參數:
/core/ffx-laboratory:echo
:這是元件 moniker。 代表元件執行個體元件拓撲內的路徑。fuchsia-pkg://fuchsiasamples.com/echo-example#meta/echo.cm
:這是 元件網址,指出 Fuchsia 如何解析 套件伺服器。
拓撲中現在名為 echo
的新元件執行個體。顯示
建立新的執行個體詳細資料:
ffx component show echo
您應該會看到下列輸出結果:
Moniker: /core/ffx-laboratory:echo
URL: fuchsia-pkg://fuchsiasamples.com/echo-example#meta/echo.cm
Type: CML dynamic component
Component State: Unresolved
Execution State: Stopped
請注意,已建立執行個體,但元件網址尚未解析。解析作業會在架構嘗試啟動執行個體時發生。
啟動元件執行個體
使用下列指令啟動新的 echo
元件執行個體:
ffx component start /core/ffx-laboratory:echo
這個指令可接受一個參數:
/core/ffx-laboratory:echo
:這是元件 moniker。 代表元件執行個體元件拓撲內的路徑。
這會啟動元件執行個體、向記錄顯示問候語, 然後結束開啟新的終端機視窗,並篩選訊息的裝置記錄 範例:
ffx log --filter echo
您應該會在裝置記錄中看到下列輸出內容:
[ffx-laboratory:echo][I] Hello, Alice, Bob, Spot!
探索執行個體
再次使用下列指令,再次顯示 echo
執行個體的詳細資料:
ffx component show echo
您現在應該會看到以下輸出內容:
Moniker: /core/ffx-laboratory:echo
URL: fuchsia-pkg://fuchsiasamples.com/echo-example#meta/echo.cm
Type: CML dynamic component
Component State: Resolved
Incoming Capabilities: fuchsia.logger.LogSink
pkg
Execution State: Stopped
元件狀態已變更為 Resolved
,詳情請參閱
關於元件的功能
元件不具備存取系統其他部分的環境功能。 元件所需的每項能力都必須明確轉送到元件中 元件拓撲或由其環境提供
echo
元件需要 fuchsia.logger.LogSink
能力
寫入系統記錄。您能順利查看記錄輸出內容
因為這項能力提供給 ffx-laboratory
中的元件
從 core
領域收集:
{
collections: [
{
name: "ffx-laboratory",
},
],
offer: [
{
protocol: [ "fuchsia.logger.LogSink" ],
from: "parent",
to: "#ffx-laboratory",
},
],
}
刪除執行個體
使用下列指令清除 echo
執行個體:
ffx component destroy /core/ffx-laboratory:echo