功能

组件通过功能相互交互。capability 将对资源的访问权限与一组权限相结合,提供访问控制功能和与资源互动的方式。提供的命名空间

组件只能通过其命名空间中的可检测功能以及它收到的少量编号句柄与系统和其他组件交互。

功能路由

组件在其组件清单中声明它们向系统提供的新功能,以及它们需要其他组件(或框架)提供的功能。组件框架使用这些声明来填充命名空间。

从使用组件到提供程序。由于功能通常通过父级组件路由到其子级,因此父级组件在为其子级组件定义沙盒方面发挥着重要作用。

而不是单个组件实例。环境会为分配到的领域配置框架的行为。框架会访问和使用路由到环境的功能。组件实例无权在运行时访问其环境中的功能。

借助可用性功能,组件可以声明预期在何种情况下可使用功能。

路由术语

路由术语分为以下几类:

  1. 声明功能如何在组件、其父级和其子级之间路由:
    • offer:声明所列功能可供子组件实例或子集合使用。
    • expose:声明所列功能可供父级组件或框架使用。从 self 或子组件 expose 是有效的。
  2. 组件所消耗或提供的 capability 的声明:
    • use:对于可执行组件,在运行时声明此组件所需的功能。 除非另有说明,否则 capability 会从 parent 路由,并且每项 capability 都必须具有从其来源的有效路由。
    • capabilities:声明此组件提供的功能。通过 self 提供或公开的功能必须显示在此处。这些功能通常会映射到传出目录中的一个节点。

周期检测

组件框架会强制要求在组件之间提供的功能不会形成循环。循环的最简单示例是,某个组件从子级 A 提供 capability,然后从 B 提供 capability,但没有弱选项。AB

系统会在以下时间点之间检测循环:

  • 子组件及其父级。
  • 当前组件及其子组件。

当前组件可以:

  • use 功能,除非它向这些子级提供功能。
  • use 从其父级继承功能。
  • expose 向其父级提供 capability。

如果存在周期性,可以通过以下几种策略来解决此问题。

  • 将其中一个链接标记为 dependency: "weak"。弱功能不会被视为循环检测或关闭顺序的依赖项。如果弱依赖项不存在或消失,使用弱依赖项的组件应被编程为正常运行。
  • 将其中一个组件拆分为两个没有周期的小组件。
  • 颠倒其中一个依赖项的顺序。例如,A 可以使用 B 中的第二个 capability,而不是 B 使用 A 中的 capability。为此,您可以向 AB 的清单中添加新的 capability,然后再向 A 的清单中添加新的 use

capability 类型

以下功能可以路由:

type 说明 转送至
protocol 用于打开由 FIDL 协议支持的通道的文件系统节点。 组件
service 一个文件系统目录,用于打开与多个服务实例之一的通道。 组件
directory 文件系统目录。 组件
storage 一个可写入的文件系统目录,与使用它的组件隔离。 组件
dictionary 用于将其他 capability 打包在一起的 capability。 组件
resolver 一种功能,当在环境中注册时,会导致使用该解析器解析具有特定网址架构的组件。 environments
runner 一种功能,如果在环境中注册,则允许框架在启动组件时使用该运行程序。 environments

示例

请考虑以下示例,其中描述了通过组件实例树进行 capability 路由:


capability 路由示例

在此示例中:

  • echo 组件实例将 fuchsia.Echo 协议作为其声明的功能之一提供。
  • echo_tool 组件实例需要使用 fuchsia.Echo 协议 capability。

每个中间组件都会协同工作,以便将 fuchsia.Echoecho 显式路由到 echo_tool

  1. echoself 公开 fuchsia.Echo,以便其父级 services 可以看到该协议。
  2. services 将其子级 echo 中的 fuchsia.Echo 公开给其父级 shell
  3. shell 将其子项 services 中的 fuchsia.Echo 提供给另一个子项 tools
  4. tools 提供 parentfuchsia.Echo 给其子元素 echo_tool

由于找到了提供该协议功能的组件的有效路线,因此组件框架会授予 echo_tool 使用 fuchsia.Echo 的请求。

如需详细了解组件如何在运行时连接到功能,请参阅“协议开启”的生命周期