系統中的所有元件都會組合成根元件例項樹狀結構。樹狀結構中的父項元件負責將其他元件的例項宣告為子項,並提供這些子項的功能。同時,子項元件也可以將功能公開給父項。這些元件執行個體和能力關係構成了元件拓撲。
任何父項元件及其所有子項都會在樹狀結構中形成一個群組,稱為「realm」。Realms 可讓父項控管哪些功能流入及流出其元件子樹狀結構,藉此建立能力邊界。這項封裝可讓領域在內部重新整理,而不會影響依賴其公開功能的外部元件。
在上圖中,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
元件執行個體會透過稱為別名的拓樸路徑參照來識別。元件的路徑名稱會以絕對或相對路徑,指出元件例項樹狀結構中的所在位置。舉例來說,路徑名稱路徑 /core/system-updater
是指 core
領域中存在的 system-updater
例項。
元件生命週期
在元件拓撲中新增和移除元件時,系統會建立及銷毀元件例項。這可能發生在下列兩種情況:
- 靜態:在元件資訊清單中宣告例項,做為樹狀結構中其他元件的子項。只有在更新變更元件拓撲時,系統才會建立和刪除靜態元件。
- 動態:在執行階段使用
fuchsia.component.Realm
通訊協定,在元件collection
中新增或移除例項。系統關閉時會刪除動態元件。
元件遭到銷毀後,架構會移除其持續性狀態 (例如本機儲存空間)。
當其他元件嘗試向其開啟管道時,架構就會啟動元件執行個體。連線至元件公開的能力時,會隱含發生這種情況。連線至已啟動的元件會重複使用執行中的例項。
元件可能會透過退出程式 (由元件的 runner
定義) 自行停止,或是讓架構在系統關機時停止元件。
練習:整合元件
如要叫用元件,該元件必須位於有效元件拓撲中。在本練習中,您將元件新增至 ffx-laboratory
,這是一個受限制的集合,用於在產品的核心領域中進行開發。集合可讓元件在執行階段動態建立及銷毀。
啟動模擬器
如果您尚未啟動執行個體,請啟動模擬器:
啟動新的模擬器執行個體:
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.
啟動套件伺服器,讓模擬器載入軟體套件:
fx serve
新增至元件拓撲
使用下列指令建立 echo-args
元件的新執行個體:
ffx component create /core/ffx-laboratory:echo-args \
fuchsia-pkg://fuchsia.com/echo-args#meta/echo-args.cm
這項指令可接受兩個參數:
/core/ffx-laboratory:echo-args
:這是 元件別名,代表元件執行個體在元件拓撲中的路徑。fuchsia-pkg://fuchsia.com/echo-args#meta/echo_args.cm
:這是元件網址,指出 Fuchsia 應如何從套件伺服器解析元件。
拓樸中現在有一個名為 echo-args
的新元件執行個體。使用下列指令顯示新執行個體的詳細資料:
ffx component show echo-args
您應該會看到下列輸出結果:
Moniker: /core/ffx-laboratory:echo-args
URL: fuchsia-pkg://fuchsia.com/echo-args#meta/echo-args.cm
Type: CML dynamic component
Component State: Unresolved
Execution State: Stopped
請注意,已建立執行個體,但元件網址尚未解析。解析會在架構嘗試啟動執行個體時發生。
啟動元件執行個體
使用下列指令啟動新的 echo-args
元件執行個體:
ffx component start /core/ffx-laboratory:echo-args
這個指令可接受一個參數:
/core/ffx-laboratory:echo-args
:這是 元件別名,代表元件執行個體在元件拓撲中的路徑。
這會導致元件執行個體啟動,並在記錄中顯示問候語,然後結束。開啟新的終端機視窗,然後篩選裝置記錄中的訊息,如範例所示:
ffx log --filter echo
您應該會在裝置記錄中看到下列輸出內容:
[ffx-laboratory:echo-args][I] Hello, Alice, Bob, Spot!
探索執行個體
使用下列指令再次顯示 echo-args
執行個體的詳細資料:
ffx component show echo-args
您現在應該會看到下列輸出內容:
Moniker: core/ffx-laboratory:echo-args
URL: fuchsia-pkg://fuchsia.com/echo-args#meta/echo-args.cm
Type: CML dynamic component
Component State: Resolved
Incoming Capabilities: fuchsia.logger.LogSink
Exposed Capabilities: diagnostics
Execution State: Stopped
元件狀態已變更為 Resolved
,您可以查看元件功能的詳細資訊。
元件沒有環境功能,無法存取系統的其他部分。元件所需的每項能力都必須透過元件拓撲或環境提供的途徑,明確地傳送至元件。
echo-args
元件需要 fuchsia.logger.LogSink
功能才能寫入系統記錄檔。您可以成功查看記錄檔輸出內容,是因為 core
領域會將這項能力提供給 ffx-laboratory
集合中的元件:
{
collections: [
{
name: "ffx-laboratory",
},
],
offer: [
{
protocol: [ "fuchsia.logger.LogSink" ],
from: "parent",
to: "#ffx-laboratory",
},
],
}
摧毀執行個體
使用下列指令清理 echo-args
執行個體:
ffx component destroy /core/ffx-laboratory:echo-args