大区

{1换句话说,realm 是组件实例树的任何子树的另一个名称。

组件实例可能包含子组件每个 {10这些 子 realm 的并集以及 {101因此,通常将 realm 视为组件实例及其子组件集。

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

  • Realm 充当 功能边界。Realm 可以决定是否将源自 realm 的功能 路由 到 realm 之外的组件实例。这是通过组件清单中的 expose 声明实现的。
  • 子 realm 的内部结构对父组件实例是不透明的。例如,子 realm 可以构建为一个或 多个组件实例,从父 组件实例的角度来看,只要子 realm 公开同一组功能,看起来都是一样的。

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

示例

下面是一个通过 realm 路由功能的示例:


组件树状图,显示了从“echo”向上到“shell”再向下到“echo_tool”的“fuchsia.Echo”协议路由。

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

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

如需详细了解此示例中的功能路由,请参阅 组件清单功能路由示例

子组件实例

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

  • 组件实例决定了它包含哪些子组件,以及何时创建和销毁其子组件。
  • 组件实例不能没有父实例。
  • 组件实例只有在其父实例正在执行时才能执行。
  • 组件实例通过向其子组件发出 offer 声明来确定其子组件可用的功能 。
  • 组件实例对其子组件的行为具有一定程度的控制权。例如,组件实例可以通过 Realm框架服务绑定到从子组件的 realm 公开的功能 ,或设置钩子来拦截子组件生命周期事件。不过,这种控制并非绝对的。例如,组件实例无法使用未明确向其公开的子 realm 中的功能。

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

静态子组件

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

通常,除非子组件有理由是 动态的(请参阅动态子组件),否则应静态声明子组件。静态声明子组件后,可以审核其定义和功能,并且可以静态路由其功能。

静态子组件首先由以下两部分信息定义:

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

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

动态子组件

动态子组件是指在组件集合中运行时创建的组件实例。动态子组件始终限定于特定集合。动态子组件可用于支持无法提前确定组件实例的存在或基数的使用情形。例如,测试 realm 可能会声明一个集合,可以在其中创建测试组件实例。

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

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

组件集合

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

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

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

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

集合在组件清单的 collections 部分中声明。当 offer 声明以集合为目标时, 所提供的功能将可供集合中的每个实例使用。 某些功能可以从整个集合公开或提供,作为对集合中实例公开的相应功能的聚合。

TODO:以服务目录为例

示例

下图说明了包含集合的 realm:


合集示例

在此示例中,shell 组件声明了一个静态子组件 console 和一个集合 (tools),以灰色背景突出显示(() 表示法表示集合)。(tools) 包含两个动态实例:lsgrep。这些实例是 shell 的动态子组件,限定于 (tools)。 使用集合意味着无法提前知道 lsgrep 的存在。如果您想象 lsgrep 是命令行工具,它们会根据用户请求按需实例化,那么这是合理的。

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

环境

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

Realm 框架协议

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