功能

元件會透過功能彼此互動。功能結合了資源存取權和一組權利,可提供存取控管機制,以及與資源互動的方式。Fuchsia 功能通常會存取底層的核心物件,這些物件會透過元件的命名空間提供。

元件只能透過命名空間中可探索的功能,以及收到的少數編號控制代碼,與系統和其他元件互動。

能力轉送

元件會在元件資訊清單中,宣告提供給系統的新功能,以及其他元件 (或架構) 提供的功能。元件架構會使用這些宣告填入命名空間。

如要在執行階段使用功能,也必須有從取用元件到供應商的有效功能路徑。由於功能通常會透過父項元件傳送至子項元件,因此父項元件在定義子項元件的沙箱時扮演重要角色。

部分能力類型會轉送至環境,而非個別元件執行個體。環境會設定架構的行為,適用於指派環境的領域。架構會存取並使用路由至環境的功能。元件例項無法在執行階段存取環境中的功能。

可用性功能可讓元件聲明預期能力可用的情況。

轉送術語

路由術語可分為下列類別:

  1. 聲明功能在元件、父項和子項之間的路由方式:
    • offer:宣告所列能力可供子項元件例項或子項集合使用。
    • expose:宣告所列功能可供父項元件或架構使用。可以從 expose 或子項元件 self 觸發。
  2. 元件使用或提供的功能聲明:

偵測循環

元件架構會強制執行元件之間提供的功能不會形成週期。最簡單的週期範例是:元件從子項 A 提供能力給子項 B,並從 B 提供給 A,但沒有弱式選項。

偵測到以下時間的週期:

  • 子項元件及其父項。
  • 目前的元件及其子項。

目前的元件可執行下列動作:

  • use 的功能,除非是提供給這些子項的功能。
  • use 父項的能力。
  • expose 的能力。

如果出現週期性行為,可以採取幾種策略來解決這個問題。

  • 將其中一個連結標示為 dependency: "weak"。就週期偵測或關機順序而言,功能較弱不算依附元件。使用弱能力的元件應經過程式設計,確保弱能力不存在或消失時,元件仍能正常運作。
  • 將其中一個元件分割為兩個較小的元件,且這兩個元件沒有週期。
  • 反轉其中一個依附元件的順序。舉例來說,A 可以使用 B 的第二項能力,而不是使用 A 的功能。B方法是在 AB 的資訊清單中新增能力,然後在 A 的資訊清單中新增 use

功能類型

可轉送的功能如下:

類型 說明 轉送至
protocol 檔案系統節點,用於開啟由 FIDL 通訊協定支援的管道。 元件
service 用於開啟其中一個服務例項管道的檔案系統目錄。 元件
directory 檔案系統目錄。 元件
storage 可寫入的檔案系統目錄,與使用該目錄的元件隔離。 元件
dictionary 將其他功能組合在一起的功能。 元件
resolver 這項能力在環境中註冊後,會導致具有特定網址配置的元件透過該解析器解析。 環境
runner 這項能力在環境中註冊後,架構就能在啟動元件時使用該執行元件。 環境

範例

請參考下列範例,瞭解如何透過元件執行個體樹狀結構進行能力轉送:


元件樹狀圖:顯示從提供者「echo」到「services」和「shell」,再到消費者「echo_tool」的「fuchsia.Echo」通訊協定能力轉送。

在這個例子中:

  • echo 元件執行個體會將 fuchsia.Echo 通訊協定做為其中一項已宣告的能力提供。
  • echo_tool 元件執行個體需要使用 fuchsia.Echo 通訊協定能力。

每個中介元件都會合作,明確將 fuchsia.Echoecho 路由至 echo_tool

  1. echo公開 fuchsia.Echo,因此通訊協定會對父項 services 可見。self
  2. services會將子項 echofuchsia.Echo公開給父項 shell
  3. shell從子項 services 向另一個子項 tools提供 fuchsia.Echo
  4. tools 提供 fuchsia.Echo給子項 echo_toolparent

元件架構 會授予 echo_tool 的要求使用 fuchsia.Echo,因為系統已找到提供該通訊協定能力的元件有效路徑。

如要進一步瞭解元件在執行階段如何連結至功能,請參閱「通訊協定開啟的生命週期」。