大区

是指任何 换句话说,realm 是 组件实例树的任何子树的另一种说法。

组件实例可以包含子项。子区域这些子领域以及父组件实例,等同于一个子树。因此,通常将 Realm 视为组件实例及其一组子项。

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

  • 大区充当capability 边界。是否可以将来自令牌网格的 capability 路由到令牌网格之外的组件实例。这可通过在组件清单中进行 expose 声明来实现。
  • 子令牌网格的内部结构对父级组件实例而言是不可见的。例如,子王国可以构建为一个或多个组件实例,从父组件实例的角度来看,只要子王国公开了同一组功能,这两种结构看起来是一样的。

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

示例

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


Realm 示例

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

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

如需更详细地了解如何使用此示例进行 capability 路由,请参阅组件清单 capability 路由示例

子组件实例

组件实例可以包含子项。子组件实例被视为父级实例定义的一部分,并且完全归父级所有。这具有以下含义:

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

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

静态子项

静态子项是指通过 children 声明在组件的manifest中静态声明的组件实例。此声明对于确立子组件实例的存在是必要且充分的。

通常,除非有理由将子项声明为动态子项,否则应将其声明为静态子项(请参阅动态子项)。静态声明子项后,可以审核其定义和 capability,并且可以从中静态路由 capability。

静态子项首先由以下两条信息定义:

  • 子实例的名称。该名称是父级组件实例的本地名称,用于构成标识名。您可以声明具有相同网址和不同名称的多个子项。
  • 子实例的组件网址

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

动态子项

动态子项是指在运行时在组件集合中创建的组件实例。动态子项始终限定为特定集合。动态子项可用于支持无法预先确定组件实例的存在性或基数的用例。例如,测试 realm 可以声明一个用于创建测试组件实例的集合。

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

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

组件集合

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

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

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

如需详细了解组件执行和持久性,请参阅生命周期

集合在组件清单的 collections 部分中声明。当 offer 声明定位到集合时,所提供的 capability 会提供给集合中的每个实例。某些功能可以作为集合中实例公开的对应功能的汇总,从整个集合中公开或提供。

TODO:以服务目录为例

示例

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


合集示例

在此示例中,shell 组件声明了一个静态子项 console 和一个集合 (tools),以灰色背景突出显示(() 表示集合)。(tools) 包含两个动态实例:lsgrep。这些实例是 shell 的动态子项,作用域为 (tools)。使用集合意味着 lsgrep 的存在无法提前知晓。如果您假设 lsgrep 是命令行工具,会在用户请求时按需实例化,那么这种说法就很合理。

该示例还使用箭头说明了 capability 路由路径。首先,console 公开 fuchsia.Console 给其父级 shell,后者提供该接口给 (tools)。然后,fuchsia.Console 便可供集合中的任何组件实例使用,而无需单独路由到动态实例。

环境

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

Realm 框架协议

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