組織元件

系統中的所有元件都會組合成根元件例項樹狀結構。樹狀結構中的父項元件負責 宣告其他元件的例項做為其子項,並提供其子項 並介紹一些相關功能同時,子項元件也可以將功能公開回傳至父項。這些元件執行個體和能力關係 元件拓撲

任何父項元件及其所有子項都會在樹狀結構中形成一個稱為「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 元件支援許多不同類型的功能。截至目前為止 這些範例展示了兩種不同的能力類型:runnerprotocol。您可能已經注意到,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