功能

组件通过以下方式相互交互: 功能 一种将资源访问权限和一组权利相结合的功能,可提供访问权限控制和与资源互动的方式。Fuchsia 功能通常通过组件的 命名空间访问底层内核对象

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

功能路由

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

为了使功能在运行时可用,还必须存在从使用组件到提供程序的有效功能路由由于功能通常通过父组件路由到其子组件,因此父组件在定义其子组件的沙盒方面发挥着重要作用。

某些功能类型会路由到环境,而不是单个组件实例。 <环境用于配置框架在分配给它们的 realm 中的行为。路由到环境的功能由框架访问和使用。组件实例在运行时无法访问其环境中的功能。

借助可用性功能,组件可以声明对预期功能可用情况的期望。

路由术语

路由术语分为以下几类:

  1. 声明功能在组件、其父级和其子级之间的路由方式:
    • offer:声明所列功能可供子组件实例或子集合使用。
    • expose:声明所列功能可供父组件或框架使用。从 exposeself 或从子组件进行验证。
  2. 组件消耗或提供的功能声明:

循环检测

组件框架会强制执行以下要求:组件之间提供的功能不得形成循环。最简单的循环示例是,某个组件从子级 A 向子级 B 提供功能,并从 BA 提供功能,但没有弱选项。

检测到以下周期:

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

当前组件允许:

  • use 的功能,除非它正在向这些子设备提供功能。
  • use 相应功能。
  • expose 的功能。

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

  • 将其中一个链接标记为 dependency: "weak"。弱功能不计为与循环检测或关机顺序相关的依赖项。使用弱功能的组件应经过编程,以便在弱功能不存在或消失时也能正常运行。
  • 将其中一个组件拆分为两个不含环路的较小组件。
  • 反转其中一个依赖项的顺序。例如,B 不使用 A 中的功能,而是使用 B 中的第二个功能。A为此,您可以向 AB 的清单添加新功能,然后向 A 的清单添加新的 use

功能类型

以下功能可以路由:

type 说明 路由到
protocol 用于打开由 FIDL 协议支持的渠道的文件系统节点。 组件
service 用于打开与多个服务实例之一的通道的文件系统目录。 组件
directory 文件系统目录。 组件
storage 一个可写入的文件系统目录,与使用它的组件隔离。 组件
dictionary 一种将其他功能捆绑在一起的功能。 组件
resolver 一种 capability,当在环境中注册时,会导致具有特定网址协议的组件通过该解析器进行解析。 环境
runner 一种功能,在环境中注册后,框架可以在启动组件时使用该 runner。 环境

示例

请考虑以下示例,该示例描述了通过组件实例树进行的功能路由:


组件树状图,显示了从提供方“echo”向上通过“services”和“shell”到消费方“echo_tool”的“fuchsia.Echo”协议的功能路由。

在此示例中:

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

每个中间组件都会协同工作,以明确地将 fuchsia.Echoecho 路由到 echo_tool

  1. echo 通过 self 公开 fuchsia.Echo,以便协议对其父级 services 可见。
  2. services 将其子级 echo 中的 fuchsia.Echo 公开给其父级 shell
  3. shell 从其子级 services 向另一子级 tools 提供 fuchsia.Echo
  4. tools 向其子级 echo_tool 提供 parentoffer fuchsia.Echo

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

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