大区

组件实例可以包含子元素。 因此,我们通常将大区看作一个组件实例及其一组子级。

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

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

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

示例

下面是一个通过其路由的 capability 的示例:


Realm 示例

在此示例中,shell 组件有两个子级:toolsservicesservices 有两个子项:loggerecho,而 tools 有一个子项 echo_tool。组件会封装其子项,因此,虽然 shell 组件会看到自己的子项,但它并不能直接了解其子项 echo_toolloggerecho。不过,所有这些组件实例都被视为 shell 领域的一部分。

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

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

子组件实例

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

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

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

静态子项

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

通常,子项应以静态方式声明,除非其需要是动态子项(请参阅动态子项)。静态声明子项时,可以审核其定义和功能,并且可以通过静态路由权能。

静态子项主要由以下两项信息定义:

  • 子实例的名称。该名称是父组件实例的本地名称,用于构成名称。声明多个具有相同网址但名称不同的子项是有效的。
  • 子实例的组件网址

如需了解如何为子声明提供额外的配置信息,请参阅子声明

动态子级

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

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

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

组件集合

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

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

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

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

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

TODO:服务目录示例

示例

下图展示了包含集合的大区:


集合示例

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

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

环境

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

Realm 框架协议

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