配置功能

借助配置功能,组件可以定义、路由和使用配置值。使用配置 capability 的组件会在其结构化配置中看到该值。

定义配置功能

如需定义配置 capability,组件必须为其添加 capabilities 声明:

{
    capabilities: [
        {
            config: "fuchsia.config.MyBool",
            type: "bool",
            value: true,
        },
    ],
}

这定义了类型为 bool 且值为 true 的 capability fuchsia.config.MyBool。如需详细了解 typevalue 支持的字段,请参阅功能参考文档

路由配置功能

组件通过将配置功能提供给父级或提供给子级来路由配置功能。

如需详细了解该框架如何路由组件功能,请参阅功能路由

公开

公开配置 capability 可让组件的父级访问该功能:

{
    expose: [
        {
            config: "fuchsia.config.MyBool",
            from: "self",
        },
    ],
}

您可以选择性地指定:

成为协作者

提供配置 capability 可让子组件访问该 capability:

{
    offer: [
        {
            config: "fuchsia.config.MyBool",
            from: "parent",
            to: [ "#child-a", "#child-b" ],
        },
    ],
}

您可以选择性地指定:

使用配置功能

如需使用配置 capability,组件必须添加一个 use 定义,将 capability 与结构化配置值相关联。然后,该组件将能够在运行时读取其结构化配置,以查看 capability 的值。

请考虑以下结构化配置块的组件:json5 { config: { say_hello: { type: "bool" }, }, }

如需使用配置 capability,请为其添加 use 声明:

{
    use: [
        {
            config: "fuchsia.config.MyBool",
            key: "say_hello",
            from: "parent",
        },
    ],
}

当组件读取其结构化配置的 say_hello 字段时,它将接收 fuchsia.config.MyBool 的值。

您可以选择指定以下内容:

重命名

您可以 exposeoffer 使用不同名称的功能:

{
    offer: [
        {
            config: "fuchsia.config.MyBool",
            from: "#child-a",
            to: [ "#child-b" ],
            as: "fuchsia.childB.SayHello",
        },
    ],
}

配置类型

配置值支持多种类型。

无符号整数有以下几种类型:

  • uint8
  • uint16
  • uint32
  • uint64

有符号整数有以下类型:

  • int8
  • int16
  • int32
  • int64

bool 类型支持值 truefalse

string 类型除了字符串值之外,还必须设置 max_size

字符串示例:

{
    capabilities: [
        {
            config: "fuchsia.config.MyString",
            type: "string",
            max_size: 100,
            value: "test",
        },
    ]
}

vector 类型必须包含一个 element 字段,并且还设置了 type。矢量可以包含除矢量以外的所有其他类型。

矢量示例:

{
    capabilities: [
        {
            config: "fuchsia.config.MyUint8Vector",
            type: "vector",
            element: { type: "uint8" },
            max_count: 100,
            value: [1, 2, 3 ],
        },
        {
            config: "fuchsia.config.MyStringVector",
            type: "vector",
            element: {
                type: "string",
                max_size: 100,
            },
            max_count: 100,
            value: [
                "Hello",
                "World!",
            ],
        },
    ],
}

可选路由

适用于配置功能的 UseOfferExpose 支持可用性。这意味着,组件可以optionally使用配置 capability。如需了解详情,请参阅使用可选功能

默认值

如果对配置功能进行选择性路由,则来自 void 的路由意味着将为其指定默认值。在不提供默认值的情况下指定可选的配置功能是错误的。

您可以通过以下两种方式指定默认值。

在 CML 文件中定义默认值

定义默认值的最简单方法是在 CML 中使用 default 关键字指定该值。

例如:

{
    use: {
        config: "fuchsia.config.MyInt",
        key: "my_int",
        type: "int8",
        availability: "optional",
        default: 42,
    }
}

如果从 void 路由,fuchsia.config.MyInt 将收到默认值 42

CML 文件默认值始终会取代下一部分中定义的结构化配置默认值。

(旧版)将结构化配置设为默认值

定义默认值的旧方法是将其作为结构化配置包含在组件的软件包中。

例如:

{
    use: {
        config: "fuchsia.config.MyInt",
        key: "my_int",
        type: "int8",
        availability: "optional",
    }
    config: {
        my_int: {
            type: "int8"
        },
    }
}

在上述示例中,fuchsia.config.MyInt 被用作 my_int,与 config 块中的配置值匹配。然后,开发者可以使用现有的结构化配置工具在组件的软件包中创建一个配置文件,该文件将用作默认值。

请注意,此方法始终会被直接在 CML 文件中指定 default: 所替换。

解决路线和断开的路线

结构化配置值会在组件启动时传递给该组件。这意味着,组件框架必须在组件启动之前解析所有配置功能的路由。

此举的副作用是意味着组件框架无法启动具有配置功能的“中断路由”(未成功以功能定义结束的路由)的组件。例如,如果您请求 fuchsia.config.MyBool,但您的家长未向您提供它,您将无法启动。这与其他功能不同,在其他功能中,组件会在运行时发现它可能不存在。

更新配置值

由于配置值会在组件启动时传递给该组件,因此如果 capability 路线在组件运行时发生变化,该组件将不会看到任何更新。

如需启动具有不同配置的组件,需要满足以下条件:

  1. 请执行以下任一操作:
    • 更新提供配置功能的 CML(可能通过重新解析)。
    • 使用 ffx component config 工具从命令行更新配置值。
  2. 停止并启动使用配置功能的组件。