政策概念

什么是政策?

Fuchsia Settings API 协议是相当静态的,其行为无法自定义。少数接口具有可在构建时为特定产品配置的参数,但没有任何参数是可以动态调整的。

Fuchsia 设置通过政策的概念提供此功能。政策会修改 Fuchsia 设置在运行时的行为。由于调整发生在运行时,因此政策是通过 FIDL API 修改的。

任何具有适当政策权限的客户端均可读取和写入 Policy API。控制政策的功能是一项单独的权限,因为政策 API 客户端可能会影响所有 Fuchsia Settings API 客户端的行为,例如通过将最低和最高亮度值设置为相同的值来影响。

Policy API 剖析

政策是根据转换定义的,转换会修改发送到 Fuchsia Settings API 的请求。最小亮度限制就是一个转换示例。

亮度是一个简单的设置,只有一个亮度值是控制的,但假设设备有多个显示屏,每个显示屏都有自己的亮度值。在这种情况下,Policy API 的客户端需要指定其最低亮度限制适用于哪个屏幕。Policy API 将此标识符称为目标,用于指定设置的某一方面。

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 类似,但存在一些显著差异。

添加和移除,而不是设置

Policy API 提供一对 AddPolicyRemovePolicy,而不是单个 Set 方法。Fuchsia Settings API 仅提供 Set,因为设置值应始终存在。例如,系统始终会设置默认亮度级别,即使没有客户端设置过它。客户端永远不需要“移除”亮度,只需修改即可。相比之下,政策转换是对 Fuchsia Settings API 的输入执行的操作,因此,特定目标可以有任意数量的有效政策,包括没有任何政策。

“获取”而不是“观看”

Fuchsia Settings API 通过实现挂起获取模式的 Watch 方法返回值。政策仅提供简单的 GetProperties 方法以提供有关政策目标的信息,包括可能的转换和有效政策。Policy API 客户端不需要对政策更改做出响应,因此无需挂起响应。客户端应该只有在尝试添加或移除政策之前知道有效政策。

每项政策都有一个在添加时生成的唯一标识符,日后可用于移除该政策。如需添加政策,客户端需要提供政策的目标及其政策参数。

其他命名空间

Policy API 位于 fuchsia.settings.policy 命名空间中,而非 Fuchsia Settings API 所在的 fuchsia.settings 命名空间中。使用不同的命名空间需要为客户端提供不同的权限,因此,如果能够使用 Fuchsia Settings API,系统不会自动授予使用 Policy API 的权限。

卷示例的政策界面中,任何客户端都可以对任何目标应用卷上限。这样一来,您便可将多项政策应用于同一目标(无论是同一客户端还是多个客户端)。添加的所有政策均被视为有效,除非存在逻辑错误(例如,下限高于上限)。

Policy API 将尝试遵循所有现行政策,并应用交集的政策。在这种情况下,最严格的卷上限将是有效政策中最小的最大卷。如果当前的最低最大音量限制被移除,次低政策将会生效。

政策概念定义

下面回顾了政策 API 概念:

  • 目标:设置可控制方面的唯一标识符。

    例如,音量政策中的目标是各个音频流

  • 转换:对设置目标的值的操作。

    政策客户端可以为转换指定可自定义的参数,例如最大音量限制

  • 政策:客户端指定的转换及其参数。

    每项政策都有一个用于标识它们的全局唯一 ID

  • 属性:政策目标的相关信息集合。

    属性包含有关给定目标可以进行哪些转换,以及哪些政策处于有效状态的信息