是指任何 换句话说,realm 是 组件实例树的任何子树的另一种说法。
组件实例可以包含子项。子区域这些子领域以及父组件实例,等同于一个子树。因此,通常将 Realm 视为组件实例及其一组子项。
在组件框架中,Realm 具有特殊作用。领域是组件实例的封装边界。这意味着:
- 大区充当capability 边界。是否可以将来自令牌网格的 capability 路由到令牌网格之外的组件实例。这可通过在组件清单中进行
expose
声明来实现。 - 子令牌网格的内部结构对父级组件实例而言是不可见的。例如,子王国可以构建为一个或多个组件实例,从父组件实例的角度来看,只要子王国公开了同一组功能,这两种结构看起来是一样的。
领域还充当所有权边界,也就是说,子组件实例是父级组件拥有的子领域的根,父级组件会控制其存在。如需了解详情,请参阅子组件实例。
示例
下面是一个通过其中的 capability 路由的 realm 示例:
在此示例中,shell
组件有两个子项:tools
和 services
。services
有两个子元素:logger
和 echo
,而 tools
有一个子元素 echo_tool
。组件会封装其子项,因此虽然 shell
组件可以看到自己的子项,但它无法直接了解其孙子项 echo_tool
、logger
或 echo
。不过,所有这些组件实例都被视为 shell
领域的一部分。
箭头表示 fuchsia.Echo
服务 capability 的路径,该 capability 通过 realm 从 echo
路由到 echo_tool
。向上箭头对应于 expose
声明,而向下箭头代表 offer
声明。expose
声明会导致 fuchsia.Echo
在相应领域的 capability 边界之外公开。例如,如果 services
未公开 fuchsia.Echo
,shell
将不知道 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)
包含两个动态实例:ls
和 grep
。这些实例是 shell
的动态子项,作用域为 (tools)
。使用集合意味着 ls
和 grep
的存在无法提前知晓。如果您假设 ls
和 grep
是命令行工具,会在用户请求时按需实例化,那么这种说法就很合理。
该示例还使用箭头说明了 capability 路由路径。首先,console
公开 fuchsia.Console
给其父级 shell
,后者提供该接口给 (tools)
。然后,fuchsia.Console
便可供集合中的任何组件实例使用,而无需单独路由到动态实例。
环境
每个领域都会分配一个环境,用于配置该框架为领域中的组件做出的某些选择。例如,运行器功能会注册到环境,以便在该领域中的任何组件实例中使用这些功能。如需了解可通过环境配置哪些属性,请参阅环境。
Realm 框架协议
每个组件都有一个框架协议,即 fuchsia.component.Realm
。Realm
协议为组件实例提供了用于管理其领域中的子项的 API,例如绑定到子项和创建动态子项。如需查看完整文档,请参阅关联的 FIDL 定义。