organizing intro

系统中的所有组件组成一个有根的组件实例树。树中的父组件负责将其他组件的实例声明为其子组件并为它们提供能力。同时,子组件可以向父组件公开能力。这些组件实例和能力关系构成了组件拓扑

任何父组件及其所有子组件在树中形成一个称为领域的组。领域使父级能够控制那些能力流入和流出其组件的子树,从而创建能力边界。这种封装允许领域在内部进行重组,而不会影响依赖于其公开能力的外部组件。

图表展示了组件实例被组织成一个树,父组件通过“能力路由”确定每个子组件可用的能力。{: width="616"}

在上图中,fuchsia.example.Foo 协议能力通过组件实例树从提供者路由到客户端。组件使用 use 关键字声明它们需要的能力:

{
    // 程序运行的有关信息。
    program: {
        // 使用内置的 ELF 运行程序来运行二进制文件。
        runner: "elf",
        // 运行该组件的二进制文件。
        binary: "bin/client",
    },

    // 此组件所需的能力。
    use: [
        { protocol: "fuchsia.example.Foo" },
    ],
}

组件使用组件清单中的 capabilities 部分声明它们实现或提供的能力。这使得组件框架知道该能力和它的提供者。请查看下面的 provider.cml 示例:

{
    // 程序运行的有关信息。
    program: {
        // 使用内置的 ELF 运行程序来运行二进制文件。
        runner: "elf",
        // 运行该组件的二进制文件。
        binary: "bin/provider",
    },

    // 此组件提供的能力。
    capabilities: [
        { protocol: "fuchsia.example.Foo" },
    ],
    // 通过此组件路由的能力。
    expose: [
        {
            protocol: "fuchsia.example.Foo",
            from: "self",
        },
    ],
}

expose 关键字使这个组件的能力通过它的父组件向其他领域提供,这也可能包括这个组件的子组件提供的能力。在这种情况下,能力的来源是 self,因为这个组件是提供者。

父组件控制领域内的能力路由,创建从客户端组件到提供者的显式路径。请查看以下 parent.cml 清单示例:

{
    children: [
        {
            name: "provider",
            url: "fuchsia-pkg://fuchsia.com/foo-package#meta/provider.cm",
        },
        {
            name: "client",
            url: "fuchsia-pkg://fuchsia.com/foo-package#meta/client.cm",
        },
    ],
    offer: [
        {
            protocol: "fuchsia.example.Foo",
            from: "#provider",
            to: [ "#client" ],
        },
    ],
}

父组件在领域中声明一组子组件,并使用 offer 关键字将能力路由到它们。用这种方法,父组件就决定了每个子组件能力的范围和来源。这也使拓扑中的多个组件能够提供相同的能力,因为组件框架依赖于显式路由来确定如何解析来自每个客户端的请求。

注意:要获取关于组件组织的更多详细信息,请参阅组件拓扑


最后更新: 2022 年 12 月 31 日(Saturday) 21:07 CST