一個領域是指任何成分和它的孩子們。換句話說,領域是任何子樹狀結構的另一個字詞。
元件例項可能包含子項。接著,您可以定義自己的 sub-realm。這些子區域的聯集,連同 因此,一般會將領域視為元件執行個體,以及其子項集合。
Realms 在元件架構中扮演特殊角色。Realm 是元件執行個體的封裝邊界。因此:
- Realms 會做為
這取決於領域是否可以決定來自領域的能力。
這可透過 元件資訊清單中的
expose
宣告達成。 - 子領域的內部結構對父項元件例項而言是不可見的。舉例來說,子領域可以以一個或多個元件例項的形式進行結構化,且從父項元件執行個體的角度來看,只要子領域公開相同的一組功能,就會顯示相同的內容。
此範圍也做為擁有權邊界,也就是說,子項元件執行個體是子範圍的根,由父項擁有,父項會控制其存在狀態。詳情請參閱「子項元件執行個體」。
範例
以下是透過此能力路由的領域範例:
在這個範例中,shell
元件有兩個子項:tools
和 services
。services
有兩個子項 logger
和 echo
,而 tools
則有一個子項 echo_tool
。元件會封裝其子項,因此當 shell
元件看到自己的子項時,不會直接知道其孫項 echo_tool
、logger
或 echo
。不過,所有這些元件例項都會視為 shell
領域的一部分。
箭頭說明瞭 fuchsia.Echo
服務能力的路徑,該路徑會透過從 echo
到 echo_tool
的領域進行路由。向上箭頭對應至 expose
宣告,而向下箭頭則代表 offer
宣告。expose
宣告會導致 fuchsia.Echo
在對應領域的能力邊界之外公開。舉例來說,如果 services
未公開 fuchsia.Echo
,shell
就不會知道 fuchsia.Echo
的存在,因此無法向子項提供服務,或在執行階段存取該服務。
如要進一步瞭解如何透過這個範例進行能力轉送,請參閱 元件資訊清單能力轉送範例。
子項元件執行個體
元件執行個體可能包含子項。子項元件例項會視為父項例項定義的一部分,且由父項全權擁有。這會造成以下影響:
- 元件執行個體會決定其包含哪些子項,以及何時建立及銷毀子項。
- 元件執行個體必須有父項才能存在。
- 除非父項正在執行,否則元件執行個體可能不會執行。
- 元件執行個體會透過對子項進行
offer
宣告,決定子項可用的功能。 - 元件執行個體可在一定程度上控管子項的行為。舉例來說,元件執行個體可能會透過
Realm
架構服務,繫結至從子項領域公開的功能,或是設定鉤子來攔截子項生命週期事件。不過,這個控制項並非絕對值。舉例來說,元件執行個體無法使用未明確公開的子領域能力。
靜態子項
靜態子項是指在元件的manifest中,透過 children
宣告靜態宣告的元件執行個體。這項宣告是必要且足以建立子元件執行個體的存在。
一般來說,除非子項有理由採用動態方式,否則應以靜態方式宣告 (請參閱「動態子項」)。當子項以靜態方式宣告時,您可以稽核其定義和功能,並從中以靜態方式路由功能。
靜態子項主要由兩項資訊定義:
如要瞭解如何為子項宣告提供其他設定資訊,請參閱「子項」。
動態子項
動態子項是指在元件集合中於執行階段建立的元件執行個體。動態子項一律會設為特定集合的範圍。動態子項可用於支援無法預先判斷元件例項是否存在或基數的用途。舉例來說,測試領域可能會宣告可建立測試元件執行個體的集合。
建立動態子項的大部分中繼資料都與用於宣告靜態例項的相同,唯一的差異是動態子項的中繼資料是在執行階段提供。動態子項的名稱會隱含地限定為其集合;因此,在兩個不同集合中,可以有兩個名稱相同的動態子項。
能力無法從動態執行個體靜態路由。這是固有的限制:無法從動態執行個體公開的能力靜態宣告路徑。不過,某些功能可以從整個集合中轉送。待辦事項:以服務目錄為例
元件集合
集合是動態子項的容器,可在執行階段使用 Realm 架構服務建立及刪除。
集合支援兩種耐用性模式:
- Transient:當含有集合的執行個體停止時,transient 集合中的執行個體會自動銷毀。
- 單一執行:在「單一執行」集合中,系統會在建立執行個體時啟動,並在停止時銷毀。也就是說,單一執行集合中的例項只能執行一次。
如要進一步瞭解元件執行和持久性,請參閱「生命週期」。
集合會在元件資訊清單的 collections
部分中宣告。當 offer
宣告指定集合時,提供的能力就會提供給集合中的每個例項。部分功能可從集合中整體提供,做為集合中各個例項公開的對應功能的匯總。
待辦事項:以服務目錄為例
範例
下圖說明含有資料集的領域:
在這個範例中,shell
元件會宣告靜態子項 console
和集合 (tools)
,並以灰色背景加以標示 (()
符號代表集合)。(tools)
包含兩個動態例項:ls
和 grep
。這些例項是 shell
的動態子項,範圍限定為 (tools)
。使用集合表示您不知道 ls
和 grep
是否存在。假設 ls
和 grep
是命令列工具,可在使用者要求時視需要建立,這麼做就合理。
這個範例也使用箭頭說明能力轉送路徑。首先,console
會將 fuchsia.Console
公開給其父項 shell
,後者會將其提供給 (tools)
。接著,fuchsia.Console
就會開放供集合內的任何元件執行個體使用,不必個別將其路由至動態執行個體。
環境
每個領域都會指派一個環境,用來設定架構在領域中為元件做出的特定選擇。舉例來說,執行功能會註冊至環境,讓這些功能可供領域中的任何元件執行個體使用。如要瞭解可透過環境設定的屬性,請參閱「環境」一文。
Realm 架構通訊協定
每個元件都有一個架構通訊協定,即 fuchsia.component.Realm
。Realm
通訊協定會為元件執行個體提供 API,以便管理其領域中的子項,例如繫結至子項和建立動態子項。如需完整說明文件,請參閱連結的 FIDL 定義。