運作範圍

Realm 是任何 Component 及其 children 的術語。換句話說,領域是元件執行個體樹狀結構的任何子樹狀結構的另一個名稱。

元件例項可能包含子項。每個 子項元件執行個體 又定義了自己的 子領域這些子領域的聯集,以及 <因此,一般會將領域視為元件執行個體及其子項集。

領域在元件架構中扮演特殊角色。領域是元件例項的封裝界線。因此:

  • 領域是功能的界線。領域可決定是否要將源自領域的能力轉送至領域外的元件例項。這會透過expose元件資訊清單中宣告完成。
  • 子領域的內部結構對父項元件例項而言是不透明的。舉例來說,子領域可以建構為一或多個元件執行個體,只要子領域公開同一組功能,從上層元件執行個體的角度來看,這兩者看起來相同。

領域也會做為「擁有權界線」,也就是子項元件例項是父項擁有的子領域根項,父項會控管子項元件例項的存在狀態。詳情請參閱「子項元件執行個體」。

範例

以下是透過功能路徑傳送功能的領域範例:


元件樹狀結構圖表,顯示從「echo」到「shell」,再到「echo_tool」的「fuchsia.Echo」通訊協定路徑。

在本例中,shell 元件有兩個子項:toolsservicesservices 有兩個子項:loggerecho,而 tools 有一個子項 echo_tool。元件會封裝子項,因此雖然 shell 元件會看到自己的子項,但不會直接瞭解孫項 echo_toolloggerecho。不過,所有這些元件例項都視為 shell 領域的一部分。

箭頭說明 fuchsia.Echo 服務能力的路徑,該路徑會從 echo 透過領域路由至 echo_tool。向上箭頭對應 expose 宣告,向下箭頭則代表 offer 宣告。expose 宣告會導致 fuchsia.Echo 暴露在相應領域的能力邊界之外。舉例來說,如果 services 未公開 fuchsia.Echoshell 就不會知道 fuchsia.Echo 的存在,也無法向子項提供服務或在執行階段存取服務。

如要進一步瞭解如何透過這個範例進行能力轉送,請參閱元件資訊清單能力轉送範例

子項元件執行個體

元件例項可能包含子項。子項元件例項會視為父項例項定義的一部分,且完全由父項擁有。這會造成下列影響:

  • 元件執行個體會決定包含哪些子項,以及子項的建立和銷毀時間。
  • 元件執行個體必須有父項,否則無法存在。
  • 除非父項正在執行,否則元件執行個體可能不會執行。
  • 元件執行個體會向子項發出 offer 宣告,藉此決定子項可用的功能。
  • 元件執行個體可某種程度地控管子項的行為。舉例來說,元件執行個體可能會透過 Realm 架構服務,繫結至從子項領域公開的能力,或設定掛鉤來攔截子項生命週期事件。不過,這項控制項並非絕對。舉例來說,元件執行個體無法使用未明確向其公開的子領域能力。

子項元件例項分為兩種:靜態動態

靜態子項

靜態子項是元件執行個體,由 children 宣告在元件的資訊清單中。這項聲明足以建立子元件執行個體的存在。

通常應靜態宣告子項,除非有動態子項的原因 (請參閱「動態子項」)。靜態宣告子項時,可以稽核其定義和功能,並從中靜態路由傳送功能。

靜態子項主要由兩項資訊定義:

  • 子執行個體的 name。這個名稱是上層元件執行個體專屬的名稱,用於形成路徑名稱。您可以宣告多個網址相同但名稱不同的子項。
  • 子項執行個體的元件網址

如要瞭解如何向子項聲明提供其他設定資訊,請參閱「children」。

動態子項

動態子項是在元件集合中於執行階段建立的元件執行個體。動態子項一律會限定在特定集合中。動態子項可用於支援無法預先判斷元件執行個體存在與否或基數的使用案例。舉例來說,測試領域可能會宣告集合,其中可建立測試元件例項。

建立動態子項的大部分中繼資料,都與宣告靜態例項時使用的中繼資料相同,只是這些資料是在執行階段提供。動態子項的名稱會隱含地限定於其集合,因此兩個不同集合中的動態子項可以有相同名稱。

功能無法從動態執行個體靜態路由。這是固有的限制:無法從動態執行個體公開的能力靜態宣告路徑。不過,特定功能可以從整個集合路徑傳送。待辦事項:以服務目錄為例

元件集合

集合動態子項的容器,可使用 Realm 架構服務在執行階段建立及刪除。

集合支援兩種耐久性模式:

  • 暫時性:如果包含集合的執行個體停止運作,系統會自動毀損暫時性集合中的執行個體。
  • 單次執行單次執行集合中的執行個體會在建立時啟動,並在停止時刪除。也就是說,單一執行集合中的執行個體只能執行一次。

如要進一步瞭解元件執行和持續性,請參閱生命週期

集合會在元件資訊清單的 collections 區段中宣告。如果 offer 宣告以集合為目標,則集合中的每個執行個體都會提供所提供的能力。部分功能可從整個集合公開或提供,做為集合中執行個體公開的對應功能彙整。

待辦事項:以服務目錄為例

範例

下圖說明含有集合的領域:


收藏範例

在這個範例中,shell 元件會宣告靜態子項 console 和集合 (tools),並以灰色背景醒目顯示 (() 標記表示集合)。(tools) 包含兩個動態執行個體:lsgrep。這些執行個體是 shell 的動態子項,範圍限定為 (tools)。使用集合表示系統事先不知道 lsgrep 是否存在。如果您想像 lsgrep 是在使用者要求時視需要例項化的命令列工具,這就說得通了。

這個範例也以箭頭標示能力轉送路徑。首先,console 會向父項 shell公開 fuchsia.Console,父項再將其提供(tools)fuchsia.Console 即可供集合中的任何元件執行個體使用,不需要獨立傳送至動態執行個體。

環境

每個領域都會指派一個「環境」,用於設定架構為領域中的元件所做的特定選擇。舉例來說,執行元件能力會註冊至環境,因此領域中的任何元件執行個體都能使用這些能力。如要瞭解可透過環境設定的屬性,請參閱「環境」。

Realm 架構通訊協定

每個元件都有可用的架構通訊協定 fuchsia.component.RealmRealm 通訊協定提供元件執行個體的 API,用於管理領域中的子項,例如繫結至子項及建立動態子項。如需完整說明文件,請參閱連結的 FIDL 定義。