组件通过功能相互交互。capability 将对资源的访问权限与一组权限相结合,提供访问控制功能和与资源互动的方式。提供的命名空间
组件只能通过其命名空间中的可检测功能以及它收到的少量编号句柄与系统和其他组件交互。
功能路由
组件在其组件清单中声明它们向系统提供的新功能,以及它们需要其他组件(或框架)提供的功能。组件框架使用这些声明来填充命名空间。
从使用组件到提供程序。由于功能通常通过父级组件路由到其子级,因此父级组件在为其子级组件定义沙盒方面发挥着重要作用。
而不是单个组件实例。环境会为分配到的领域配置框架的行为。框架会访问和使用路由到环境的功能。组件实例无权在运行时访问其环境中的功能。
借助可用性功能,组件可以声明预期在何种情况下可使用功能。
路由术语
路由术语分为以下几类:
- 声明功能如何在组件、其父级和其子级之间路由:
- 组件所消耗或提供的 capability 的声明:
use
:对于可执行组件,在运行时声明此组件所需的功能。 除非另有说明,否则 capability 会从parent
路由,并且每项 capability 都必须具有从其来源的有效路由。capabilities
:声明此组件提供的功能。通过self
提供或公开的功能必须显示在此处。这些功能通常会映射到传出目录中的一个节点。
周期检测
组件框架会强制要求在组件之间提供的功能不会形成循环。循环的最简单示例是,某个组件从子级 A
提供 capability,然后从 B
提供 capability,但没有弱选项。A
B
系统会在以下时间点之间检测循环:
- 子组件及其父级。
- 当前组件及其子组件。
当前组件可以:
use
功能,除非它向这些子级提供功能。use
从其父级继承功能。expose
向其父级提供 capability。
如果存在周期性,可以通过以下几种策略来解决此问题。
- 将其中一个链接标记为
dependency: "weak"
。弱功能不会被视为循环检测或关闭顺序的依赖项。如果弱依赖项不存在或消失,使用弱依赖项的组件应被编程为正常运行。 - 将其中一个组件拆分为两个没有周期的小组件。
- 颠倒其中一个依赖项的顺序。例如,
A
可以使用B
中的第二个 capability,而不是B
使用A
中的 capability。为此,您可以向A
和B
的清单中添加新的 capability,然后再向A
的清单中添加新的use
。
capability 类型
以下功能可以路由:
type | 说明 | 转送至 |
---|---|---|
protocol |
用于打开由 FIDL 协议支持的通道的文件系统节点。 | 组件 |
service |
一个文件系统目录,用于打开与多个服务实例之一的通道。 | 组件 |
directory |
文件系统目录。 | 组件 |
storage |
一个可写入的文件系统目录,与使用它的组件隔离。 | 组件 |
dictionary |
用于将其他 capability 打包在一起的 capability。 | 组件 |
resolver |
一种功能,当在环境中注册时,会导致使用该解析器解析具有特定网址架构的组件。 | environments |
runner |
一种功能,如果在环境中注册,则允许框架在启动组件时使用该运行程序。 | environments |
示例
请考虑以下示例,其中描述了通过组件实例树进行 capability 路由:
在此示例中:
echo
组件实例将fuchsia.Echo
协议作为其声明的功能之一提供。echo_tool
组件实例需要使用fuchsia.Echo
协议 capability。
每个中间组件都会协同工作,以便将 fuchsia.Echo
从 echo
显式路由到 echo_tool
:
echo
从self
公开fuchsia.Echo
,以便其父级services
可以看到该协议。services
将其子级echo
中的fuchsia.Echo
公开给其父级shell
。shell
将其子项services
中的fuchsia.Echo
提供给另一个子项tools
。tools
提供parent
的fuchsia.Echo
给其子元素echo_tool
。
由于找到了提供该协议功能的组件的有效路线,因此组件框架会授予 echo_tool
使用 fuchsia.Echo
的请求。
如需详细了解组件如何在运行时连接到功能,请参阅“协议开启”的生命周期。