功能

capabilitiescapability 结合了对资源的访问权限和一系列权限,提供了访问权限控制机制以及资源交互方式。

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

功能路由

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

由于 capability 通常通过父级组件路由到其子级,因此父级组件在为其子组件定义沙盒方面发挥着重要作用。

环境用于为框架所分配到的领域配置框架的行为。路由到环境的功能由框架访问和使用。组件实例没有对其环境中的功能的运行时访问权限。

通过可用性功能,组件可以声明有关其期望功能在哪些情况下可用的情况的预期。

路由术语

路由术语分为以下几类:

  1. 关于如何在组件、其父级和子级之间路由功能的声明:
    • offer:声明列出的功能可供子组件实例或子集合使用。
    • expose:声明所列功能可供父组件或框架使用。从 self 或子组件 expose 有效。
  2. 声明组件使用或提供的功能:
    • use除非另有说明,否则这些功能会从 parent 进行路由,并且每个 capability 都必须有从其来源发出的有效路由。
    • capabilities:声明此组件提供的功能。self 提供或提供的功能必须显示在此处。

功能类型

可以路由以下功能:

type 说明 路由至
protocol 一个文件系统节点,用于打开由 FIDL 协议支持的通道。 组件
service 一个文件系统目录,用于打开通向多个服务实例之一的频道。 组件
directory 文件系统目录。 组件
storage 一个可写的文件系统目录,该目录会隔离到使用该目录的组件。 组件
resolver 在环境中注册此功能后,具有特定网址架构的组件将通过该解析器进行解析。 环境
runner 在环境中注册的一项功能,可让框架在启动组件时使用该运行程序。 环境

示例

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


功能路由示例

在此示例中:

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

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

  1. echo 会公开 self 中的 fuchsia.Echo,因此协议对其父级 services 可见。
  2. services 会将从子级 echofuchsia.Echo 公开给其父级 shell
  3. shellfuchsia.Echo 从其子项 services 提供给另一个子项 tools
  4. tools fuchsia.Echoparent 提供给其子级 echo_tool

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

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