什麼是政策?
Fuchsia Settings API 通訊協定相當靜態,因此無法自訂。某些介面在建構期間可針對特定產品設定的參數,但無法動態調整。
Fuchsia Settings 透過政策的概念提供這項功能。政策會修改 Fuchsia 設定在執行階段的行為。由於調整是在執行階段發生,因此政策是透過 FIDL API 修改。
任何具備適當政策權限的用戶端都可以讀取及寫入 Policy API。控制政策的能力是另外的權限,因為政策 API 用戶端可能會影響所有 Fuchsia Settings API 用戶端的行為,例如將最小和最大亮度值設為相同的值。
政策 API 剖析
政策是根據「轉換」定義,可修改傳送至 Fuchsia Settings API 的要求。例如轉換亮度下限就是轉換的例子。
亮度設定簡單且只能控制一個亮度值,但假設裝置有多個螢幕,每個螢幕都有各自的亮度值。在這種情況下,Policy API 的用戶端必須指定要套用的最低亮度限制螢幕。Policy API 會將這個 ID 呼叫為「目標」,以指定設定的部分。
Policy API 範例
library fuchsia.settings.policy;
alias PolicyId = uint32;
@discoverable
protocol VolumePolicyController {
GetProperties() -> (struct {
properties vector<Property>:MAX;
});
AddPolicy(struct {
target Target;
parameters PolicyParameters;
}) -> (struct {
policy_id PolicyId;
}) error Error;
RemovePolicy(struct {
policy_id PolicyId;
}) -> () error Error;
};
type Property = table {
1: target Target;
2: available_transforms vector<Transform>:MAX;
3: active_policies vector<Policy>:MAX;
};
type Target = strict union {
1: stream fuchsia.media.AudioRenderUsage;
};
type Transform = strict enum : uint8 {
MAX = 1;
MIN = 2;
};
type Policy = table {
1: policy_id PolicyId;
2: parameters PolicyParameters;
};
type PolicyParameters = strict union {
1: min Volume;
2: max Volume;
};
type Volume = table {
1: volume float32;
};
Policy API 與 Fuchsia Settings API 類似,但有一些明顯差異。
新增及移除而非 Set
Policy API 不是單一 Set 方法,而是提供 AddPolicy
和 RemovePolicy
組合。Fuchsia Settings API 只提供 Set
,因為設定值一律會存在。例如,即使用戶端未設定預設亮度等級,也一律會有預設亮度。客戶不必「移除」亮度等級,只需修改亮度即可。相反地,政策轉換是用來對 Fuchsia Settings API 的輸入內容執行操作,因此特定目標可有任意數量的政策,包括無政策。
從旁選擇
Fuchsia Settings API 會透過實作等待取得模式的手錶方法傳回值。政策僅提供簡單的 GetProperties
方法提供政策目標的相關資訊,包括可能的轉換和啟用中的政策。Policy API 用戶端應該不會回應變更的政策,因此不需要先等候。在嘗試新增或移除政策前,用戶端只需知道使用中的政策即可。
每項政策都有專屬 ID,系統會在新增政策時產生。日後可以用於移除政策。如要新增政策,用戶端必須提供政策目標,以及政策的參數。
不同命名空間
Policy API 位於 fuchsia.settings.policy
命名空間,而非 Fuchsia Settings API 所在的 fuchsia.settings
命名空間。使用其他命名空間需要用戶端不同的權限,因此使用 Fuchsia Settings API 時,系統不會自動授予使用 Policy API 的權限。
在磁碟區政策介面範例中,任何用戶端都能對任何目標套用最大磁碟區限制。如此一來,無論從同一個用戶端或來自多個用戶端,即可將多項政策套用至同一個目標。除非有邏輯錯誤 (例如上限高於上限),否則所有新增的政策都會視為有效。
Policy API 會嘗試遵循所有使用中的政策,並套用交叉政策。在這種情況下,最嚴格的磁碟區限制就是有效政策的最大音量。如果移除目前的最低磁碟區限制值,下一個最低的政策就會生效。
政策概念定義
以下重點回顧政策 API 概念:
目標:設定可控制部分的專屬 ID。
例如,音量政策中的目標是個別音訊串流
轉換:對設定目標值執行運算。
政策用戶端可以指定轉換的可自訂參數,例如用量上限
政策:用戶端指定的轉換及其參數。
每個政策都有全域專屬 ID,以供識別
資源:一組政策目標相關資訊。
屬性包含關於特定目標中可進行的轉換及哪些政策啟用的相關資訊