功能

组件通过 功能 ,了解所有最新动态。capability 可以合并对资源的访问 以及一组权限,提供访问控制和 资源。Fuchsia 功能通常会访问底层的 内核对象标识名 提供的组件 命名空间 ,了解所有最新动态。

一个组件只能通过 其命名空间中可检测到的功能, 带编号的句柄

功能路由

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

要使功能在运行时可用,还必须有一个有效的 功能路由 从使用方组件 提供商。由于 capability 通常通过父组件进行路由 父组件在定义 子组件使用沙盒

部分功能类型会路由到 环境 改为 相较于单个组件实例环境会配置 框架。发送到以下设备的 capability 由框架访问和使用。组件实例 具有运行时访问其环境中功能的权限。

availability 功能可让组件声明 客户预期在哪些情境下获得相应能力 可用。

路由术语

路由术语分为以下几类:

  1. 有关如何在组件、其 父元素及其子元素:
    • offer:声明列出的功能可供 子组件实例或 子集合
    • expose:声明列出的功能可供 父组件或框架有效期至 expose,有效期为 self 或从子组件导入。
  2. 声明由组件使用或提供的功能:
    • use:对于可执行组件,声明此 组件需要在其 命名空间 。 除非另有指定,否则 capability 从 parent 进行路由。 并且每个功能必须具有从其来源开始的有效路由。
    • capabilities:声明此组件提供的功能。 通过 self 提供或提供的 capability 必须显示在此处。 这些功能通常会映射到 传出目录 ,了解所有最新动态。

循环检测

组件框架强制实施了组件之间 不会形成循环。最简单的循环示例是 提供从子级 A 到子级 B 以及从 BA 的功能, 也就是较弱的选项

检测循环:

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

当前组件可以:

  • use 功能,除非应用提供以下功能: 儿童。
  • use 从其父级功能。
  • expose 功能分配给其父级。

如果存在循环,可以通过多种策略加以解决。

  • 将其中一个链接标记为 dependency: "weak"。弱功能不算在内 作为依赖项来检测周期检测或关闭排序的。答 使用弱功能的组件必须进行编程, 这个弱功能不存在或消失
  • 将其中一个组件拆分为两个没有循环的较小组件。
  • 反转其中一个依赖项的顺序。例如,不使用 B 使用 capability 来自 AA 可以使用 B 中的第二项功能。为此,可以 向 AB 的清单中添加新功能,然后添加新的 use 添加到 A 的清单中。

功能类型

可以路由以下功能:

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

示例

请考虑以下示例,该示例描述了通过 组件实例树:


功能路由示例

在此示例中:

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

每个中间组件协同工作,以显式方式将 fuchsia.Echo 从 从 echo 更改为 echo_tool

  1. echo 公开了来自 selffuchsia.Echo,以便协议对以下用户可见 其父级 services
  2. services 会将其子级 echofuchsia.Echo 公开给其父级。 shell
  3. shell 向其子项 services 提供 fuchsia.Echo 给另一个子项, tools
  4. tools parentfuchsia.Echo 提供给其子级 echo_tool

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

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