組織元件

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

任何父項元件及其所有子項在樹狀結構中都會形成一個群組,稱為 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-updatersystem-updater 的例項 於 core 領域中。

元件生命週期

新增及移除元件執行個體時,系統會建立及刪除元件執行個體 加入元件拓撲這種情況可能有兩種情況:

  • 靜態:執行個體在元件資訊清單中宣告為子項 其他元件的結構靜態元件只會建立 在更新變更元件拓撲時刪除。
  • 動態:在元件 collection 中新增或移除執行個體 在執行階段使用 fuchsia.component.Realm 通訊協定動態元件是 會在系統關閉時刪除。

元件刪除後,架構會移除其持續性狀態 (例如本機儲存空間)。

當另一個元件嘗試執行以下動作時,架構會啟動一個元件執行個體 開啟頻道這會以隱含的方式發生,且連線至 所有元件公開的能力連線至元件 執行個體啟動後,會重複使用執行中的執行個體。

元件可以藉由退出程式 (由 元件的 runner),或者架構可能會停止執行該元件,以供執行 像是系統關機

顯示元件如何有兩種不同的狀態:執行個體和
這些狀態共同描述了「元件生命週期」。

練習:整合元件

元件必須存在於使用中,才能叫用元件 元件拓撲在本練習中,您需要將元件加入 ffx-laboratory:內部用於開發的受限集合 評估產品在核心運作範圍方面的表現。透過集合,您可以動態調整元件 卻會遭到系統刪除

啟動模擬器

如果您還沒有執行中的執行個體,請啟動模擬器:

  1. 啟動新的模擬器執行個體:

    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.
    
  2. 啟動套件伺服器,讓模擬器載入軟體套件:

    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