政策概念

什麼是政策?

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 方法,而是提供 AddPolicyRemovePolicy 組合。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,以供識別

  • 資源:一組政策目標相關資訊。

    屬性包含關於特定目標中可進行的轉換及哪些政策啟用的相關資訊