组件通过以下方式相互交互: 功能 一种将资源访问权限和一组权利相结合的功能,可提供访问权限控制和与资源互动的方式。Fuchsia 功能通常通过组件的 命名空间访问底层内核对象。
组件只能通过其命名空间中可发现的功能以及它接收的少量编号句柄与系统和其他组件进行交互。
功能路由
组件会在其组件清单中声明它们向系统提供的新功能,以及它们所需的其他组件(或框架)提供的功能。组件框架使用这些声明来填充命名空间。
为了使功能在运行时可用,还必须存在从使用组件到提供程序的有效功能路由。由于功能通常通过父组件路由到其子组件,因此父组件在定义其子组件的沙盒方面发挥着重要作用。
某些功能类型会路由到环境,而不是单个组件实例。 <环境用于配置框架在分配给它们的 realm 中的行为。路由到环境的功能由框架访问和使用。组件实例在运行时无法访问其环境中的功能。
借助可用性功能,组件可以声明对预期功能可用情况的期望。
路由术语
路由术语分为以下几类:
- 声明功能在组件、其父级和其子级之间的路由方式:
- 组件消耗或提供的功能声明:
use:对于可执行组件,声明此组件在运行时所需的 capability。除非另有指定,否则功能会从parent路由,并且每个功能都必须具有来自其来源的有效路由。capabilities:声明相应组件提供的功能。 从self提供或公开的功能必须显示在此处。 这些功能通常会映射到 出站目录中的节点。
循环检测
组件框架会强制执行以下要求:组件之间提供的功能不得形成循环。最简单的循环示例是,某个组件从子级 A 向子级 B 提供功能,并从 B 向 A 提供功能,但没有弱选项。
检测到以下周期:
- 子组件及其父组件。
- 当前组件及其子组件。
当前组件允许:
use的功能,除非它正在向这些子设备提供功能。use相应功能。expose的功能。
如果存在周期性,您可以采取以下几种策略来解决此问题。
- 将其中一个链接标记为
dependency: "weak"。弱功能不计为与循环检测或关机顺序相关的依赖项。使用弱功能的组件应经过编程,以便在弱功能不存在或消失时也能正常运行。 - 将其中一个组件拆分为两个不含环路的较小组件。
- 反转其中一个依赖项的顺序。例如,
B不使用A中的功能,而是使用B中的第二个功能。A为此,您可以向A和B的清单添加新功能,然后向A的清单添加新的use。
功能类型
以下功能可以路由:
| type | 说明 | 路由到 |
|---|---|---|
protocol |
用于打开由 FIDL 协议支持的渠道的文件系统节点。 | 组件 |
service |
用于打开与多个服务实例之一的通道的文件系统目录。 | 组件 |
directory |
文件系统目录。 | 组件 |
storage |
一个可写入的文件系统目录,与使用它的组件隔离。 | 组件 |
dictionary |
一种将其他功能捆绑在一起的功能。 | 组件 |
resolver |
一种 capability,当在环境中注册时,会导致具有特定网址协议的组件通过该解析器进行解析。 | 环境 |
runner |
一种功能,在环境中注册后,框架可以在启动组件时使用该 runner。 | 环境 |
示例
请考虑以下示例,该示例描述了通过组件实例树进行的功能路由:

在此示例中:
echo组件实例将fuchsia.Echo协议作为其声明的功能之一提供。echo_tool组件实例需要使用fuchsia.Echo协议功能。
每个中间组件都会协同工作,以明确地将 fuchsia.Echo 从 echo 路由到 echo_tool:
echo通过self公开fuchsia.Echo,以便协议对其父级services可见。services将其子级echo中的fuchsia.Echo公开给其父级shell。shell从其子级services向另一子级tools提供fuchsia.Echo。tools向其子级echo_tool提供parent的 offerfuchsia.Echo。
组件框架授予了来自 echo_tool 的使用 fuchsia.Echo 的请求,因为找到了提供该协议功能的组件的有效路由。
如需详细了解组件如何在运行时连接到功能,请参阅协议打开的生命周期。