系統中的所有元件都組成 元件執行個體樹狀結構。樹狀結構中的父項元件負責 宣告其他元件的例項做為其子項,並提供其子項 並介紹一些相關功能同時,子項元件 返回父項這些元件執行個體和能力關係 元件拓撲。
任何父項元件及其所有子項在樹狀結構中都會形成一個群組,稱為 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
是 system-updater
的例項
於 core
領域中。
元件生命週期
新增及移除元件執行個體時,系統會建立及刪除元件執行個體 加入元件拓撲這種情況可能有兩種情況:
- 靜態:執行個體在元件資訊清單中宣告為子項 其他元件的結構靜態元件只會建立 在更新變更元件拓撲時刪除。
- 動態:在元件
collection
中新增或移除執行個體 在執行階段使用fuchsia.component.Realm
通訊協定動態元件是 會在系統關閉時刪除。
元件刪除後,架構會移除其持續性狀態 (例如本機儲存空間)。
當另一個元件嘗試執行以下動作時,架構會啟動一個元件執行個體 開啟頻道這會以隱含的方式發生,且連線至 所有元件公開的能力連線至元件 執行個體啟動後,會重複使用執行中的執行個體。
元件可以藉由退出程式 (由
元件的 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
:這是元件 moniker。 代表元件執行個體元件拓撲內的路徑。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
:這是元件 moniker。 代表元件執行個體元件拓撲內的路徑。
這會啟動元件執行個體、向記錄顯示問候語, 然後結束開啟新的終端機視窗,並篩選訊息的裝置記錄 範例:
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
能力
寫入系統記錄。您能順利查看記錄輸出內容
因為這項能力提供給 ffx-laboratory
中的元件
從 core
領域收集:
{
collections: [
{
name: "ffx-laboratory",
},
],
offer: [
{
protocol: [ "fuchsia.logger.LogSink" ],
from: "parent",
to: "#ffx-laboratory",
},
],
}
刪除執行個體
使用下列指令清除 echo-args
執行個體:
ffx component destroy /core/ffx-laboratory:echo-args