設定功能可讓元件定義、路由及使用設定值。使用設定能力的元件會在其結構化設定中看到該值。
定義設定功能
如要定義設定能力,元件必須為其新增 capabilities
宣告:
{
capabilities: [
{
config: "fuchsia.config.MyBool",
type: "bool",
value: true,
},
],
}
這會定義 bool
類型的 fuchsia.config.MyBool
能力,其值為 true
。如要進一步瞭解 type
和 value
支援的欄位,請參閱功能參考資料。
轉送設定功能
如要進一步瞭解架構如何轉送元件功能,請參閱「功能轉送」。
公開
公開設定能力可讓元件的父項存取該能力:
{
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
的值。
您可以選擇指定下列項目:
重新命名
您可以使用其他名稱expose
或offer
能力:
{
offer: [
{
config: "fuchsia.config.MyBool",
from: "#child-a",
to: [ "#child-b" ],
as: "fuchsia.childB.SayHello",
},
],
}
設定類型
設定值支援的類型很多。
無正負號整數包含下列類型:
uint8
uint16
uint32
uint64
帶正負號整數分為下列類型:
int8
int16
int32
int64
bool
類型支援 true
或 false
的值。
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!",
],
},
],
}
選用路由
Use
、Offer
和 Expose
的設定功能支援供應情形。這表示元件可以 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
,但家長並未提供,您就無法啟動。這與其他功能不同,因為元件會在執行階段發現可能不存在的功能。
更新設定值
由於設定值會在啟動時傳送給元件,因此如果元件執行時能力路徑有所變更,元件就不會看到任何更新。
如要啟動具有不同設定的元件,必須執行下列操作:
- 以下任一項:
- 更新提供設定能力的 CML (可能透過重新解決) 更新。
- 使用
ffx component config
工具,透過指令列更新設定值。
- 停止,然後啟動使用設定能力的元件。