設定功能

設定功能可讓元件定義、路由及使用設定值。使用設定能力的元件會在其結構化設定中看到該值。

定義設定功能

如要定義設定能力,元件必須為其新增 capabilities 宣告:

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

這會定義 bool 類型的 fuchsia.config.MyBool 能力,其值為 true。如要進一步瞭解 typevalue 支援的欄位,請參閱功能參考資料

轉送設定功能

元件會將設定功能公開給上層或提供給子項。

如要進一步瞭解架構如何轉送元件功能,請參閱「功能轉送」。

公開

公開設定能力可讓元件的父項存取該能力:

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

您可以選擇指定下列項目:

提供

提供設定能力可讓子元件存取該能力:

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

您可以選擇指定下列項目:

使用設定功能

如要使用設定能力,元件必須新增 use 定義,將能力連結至結構化設定值。然後,該元件能夠在執行階段讀取結構化設定,查看能力的值。

請考慮使用下列結構化設定區塊的元件: json5 { config: { say_hello: { type: "bool" }, }, }

如要使用設定能力,請為其新增 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 使用設定能力。詳情請參閱使用選用功能

預設值

如果可選的設定能力已重新導向,則從 void 重新導向,表示會提供預設值。如果未提供預設值,就會發生指定選用設定能力的錯誤。

您可以透過兩種方式指定預設值。

在 CML 檔案中定義預設值

定義預設值最簡單的方法,就是在 CML 中使用 default 關鍵字指定預設值。

例如:

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

如果 fuchsia.config.MyInt 是從 void 轉送,則會收到 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,但家長並未提供,您就無法啟動。這與其他功能不同,因為元件會在執行階段發現可能不存在的功能。

更新設定值

由於設定值會在啟動時傳送給元件,因此如果元件執行時能力路徑有所變更,元件就不會看到任何更新。

如要啟動具有不同設定的元件,必須執行下列操作:

  1. 以下任一項:
    • 更新提供設定能力的 CML (可能透過重新解決) 更新。
    • 使用 ffx component config 工具,透過指令列更新設定值。
  2. 停止,然後啟動使用設定能力的元件。