大区

组件实例可以包含子级。 因此,通常将领域视为组件实例及其子项集。

Realm 在组件框架中发挥着特殊作用。领域是组件实例的封装边界。这意味着:

  • 这通过在组件清单中使用 expose 声明来实现。
  • 子领域的内部结构对父组件实例是不透明的。例如,子领域可以构造为一个或多个组件实例,并且从父组件实例的角度来看,只要子领域公开相同的一组功能,这看起来就一样。

领域还充当所有权边界,也就是说,子组件实例是父领域拥有的子领域(控制其存在)的根。如需了解详情,请参阅子组件实例

示例

下面是一个通过其路由功能的大区示例:


Realm 示例

在此示例中,shell 组件有两个子级:toolsservicesservices 有两个子项,即 loggerecho,而 tools 有一个子项 echo_tool。组件封装了它们的子项,因此,虽然 shell 组件可以看到自己的子项,但它并不知道自己的子项(echo_toolloggerecho)。不过,所有这些组件实例都被视为 shell 领域的一部分。

箭头表示 fuchsia.Echo 服务功能的路径,服务功能通过 Realm 从 echo 路由到 echo_tool。向上箭头对应于 expose 声明,而向下箭头表示 offer 声明。expose 声明会导致 fuchsia.Echo 在相应领域的功能边界之外公开。例如,如果 services 未公开 fuchsia.Echoshell 将不会知道 fuchsia.Echo 的存在,并且无法向其子级提供服务或在运行时访问该服务。

如需查看此示例的功能路由更详细的演示,请参阅组件清单功能路由示例

子组件实例

组件实例可以包含子元素。子组件实例被视为父实例定义的一部分,并由父组件完全拥有。这会产生以下影响:

  • 组件实例决定它包含哪些子项,以及何时创建和销毁其子项。
  • 如果没有父组件,组件实例就无法存在。
  • 组件实例只有在其父项正在执行时才能执行。
  • 组件实例通过向其子项发出 offer 声明来确定其子项可用的功能。
  • 组件实例可在一定程度上控制其子级的行为。例如,组件实例可以绑定到通过 Realm 框架服务从子级的 Realm 中公开的功能,或者设置钩子来拦截子级生命周期事件。不过,此控制不是绝对的。例如,组件实例无法使用未明确提供给它的子领域中的功能。

子组件实例有两种类型:静态动态

静态子元素

静态子级是通过 children 声明在组件的清单中静态声明的组件实例。此声明是确定子组件实例的存在的必要且充分的声明。

通常,除非出于动态原因,否则应以静态方式声明子项(请参阅动态子项)。当以静态方式声明子项时,可以审核其定义和功能,并且可以从其静态路由权能。

静态子项主要通过以下两条信息进行定义:

  • 子实例的名称。该名称是父组件实例的本地名称,用于形成名称。可以使用相同网址和不同的名称声明多个子节点。
  • 子实例的组件网址

如需了解如何为子声明提供其他配置信息,请参阅子声明

动态子元素

动态子级是指在运行时在组件集合中创建的组件实例。动态子项的作用域始终限定为特定集合。动态子项可用于支持无法提前确定组件实例是否存在或基数的用例。例如,测试领域可能会声明可在其中创建测试组件实例的集合。

创建动态子级的大多数元数据与用于声明静态实例的元数据相同,区别在于前者是在运行时提供的。动态子项的名称隐式限定为其集合;因此,可以在两个同名的不同集合中拥有两个动态子项。

不能从动态实例以静态方式路由功能。这是固有的限制:无法通过动态实例公开的功能以静态方式声明路由。不过,某些功能可以从整个集合中路由。TODO:服务目录示例

组件集合

集合是可以在运行时使用 Realm 框架服务创建和销毁动态子项的容器。

集合支持两种“持久性”模式:

  • 暂时性暂时性集合中的实例会在包含该集合的实例停止时自动销毁。
  • 单次运行:“单次运行”集合中的实例在创建时启动,并在停止时销毁。这意味着单个运行集合中的实例只能运行一次。

如需详细了解组件的执行和持久性,请参阅lifecycle

集合在组件清单的 collections 部分中声明。当 offer 声明以某个集合为目标时,提供的功能可用于该集合中的每个实例。部分功能可以在集合中作为一个整体提供或提供,作为集合中的实例公开的相应功能的汇总。

TODO:服务目录示例

示例

下图展示了包含集合的 Realm:


集合示例

在本例中,shell 组件声明了一个静态子级 console 和一个集合 (tools),并用灰色背景突出显示(() 表示法表示一个集合)。(tools) 包含两个动态实例:lsgrep。这些实例是 shell 的动态子项,作用域限定为 (tools)。使用集合意味着事先并不知道 lsgrep 的存在。如果您认为 lsgrep 是命令行工具,会在用户请求时按需实例化,这种做法是合理的。

该示例还展示了带有箭头的功能路由路径。首先,consolefuchsia.Console 公开给其父级 shell,从而将其提供给 (tools)然后,集合中的任何组件实例便都可供集合中的任何组件实例使用,而无需单独将其路由到动态实例。fuchsia.Console

环境

每个领域都分配有一个环境,用于配置框架为领域中的组件所做的某些选择。例如,运行程序功能注册到环境中,这使得它们可供领域中的任何组件实例使用。如需了解可通过环境配置哪些属性,请参阅环境

Realm 框架协议

每个组件都有可用的框架协议,即 fuchsia.component.RealmRealm 协议为组件实例提供 API,以管理其领域的子级,例如绑定到子级和创建动态子级。如需查看完整文档,请参阅链接的 FIDL 定义。