通常,根据其运行的上下文调整组件实例的行为非常有用。在 Fuchsia 中,这称为“组件配置”。本页介绍了组件配置,并讨论了需要配置的不同情况的一些特征。
如需详细了解 Fuchsia 为组件配置提供的不同机制以及应使用哪种机制来解决每种问题,请参阅组件配置机制。
什么是组件配置?
“组件配置数据”是指向组件实例提供的数据,可用于了解其启动环境并适应该环境(例如产品、董事会、build 类型、Omaha 渠道、监管区域或集成测试区域)。“组件配置”是指定义、传送和使用此类数据的过程。配置组件非常有用,因为它支持在不同的上下文中使用同一组件,例如,同一组件可以在不同的产品中或不同的硬件平台上使用。如果不进行组件配置,开发者需要创建多个组件,例如“foo_for_product_a”“foo_for_product_b”和“foo_for_testing”。
组件会使用各种不同的输入。其中大多数输入都可能会改变组件的行为,但只有部分输入应被视为“组件配置数据”,而不是更笼统的“数据”,例如系统的某种状态或某种用户输入。组件配置数据与其他形式的数据之间的界限可能很模糊,但进行这种区分很重要,因为专为组件配置数据设计的机制在应用于其他情况时通常效果不佳。每种情况下都会存在例外情况,但配置值具有以下特点:
- 通常在组件实例的生命周期内保持不变
- 通常在某些设备上保持不变
- 通常由开发者、维护者或管理员设置,而不是由最终用户设置。
以下是组件配置的典型示例:
- 功能标志 - 使用布尔值配置启用或停用组件的某些功能。对于可能需要在遇到问题时快速停用的新功能,此方法通常很有用。例如,我们在 2022 年使用了功能标志,以安全地启用使用 Pinweaver 加密账号数据分区。
- 开发板调优 - 修改组件的行为以适应其所运行的开发板。例如,为 CPU 时钟提供中位数误差和误差边界。
- 产品优化 - 修改组件的行为以适应其所运行的产品。例如,指定 Session Manager 应启动哪个会话组件。
- 测试控制 - 指定在测试中使用组件时的不同行为。例如,在集成测试中使用组件时,设置更快的重试超时,以缩短运行测试所需的时间。
- 调试控件 - 启用或停用其他组件诊断信息,以协助调试。例如,在
eng
build 中启用管理员 FIDL 接口,但在user
build 中不启用。
以下情况表明数据实际上并非组件配置数据
- 数据由组件本身修改。更改某些可配置状态(例如响应 FIDL 请求)的组件必须通过配置输入中的更改来合理化这些更改。在这些情况下,通常必须定义两个类似但不同的状态:一个组件配置状态(例如“default_foo”)和一个系统状态(例如“foo”)。该组件最初会将 foo 设为 default_foo,但这两个值之后可能会独立变化。组件拥有 foo 的状态,但配置系统拥有 default_foo 的状态。
- 组件实例会针对其与之互动的每个组件使用不同的数据。如果服务器支持来自不同客户端的连接,并允许每个客户端量身定制互动,则配置是“连接配置”,而不是“组件配置”。这里讨论的机制并非旨在解决此问题,但如上所述,可能仍有组件配置状态可用于定义用于新连接的“默认”值。
- 数据在运行时频繁且快速变化。组件配置数据反映了组件实例启动的环境。这些环境通常是常量,但在某些情况下,环境或与环境关联的配置数据可能会在运行时发生变化。例如,用户可能会飞往不同的监管区域,或者产品可能会启用新功能。不过,这些运行时更改的频率仍然远低于许多系统状态的更改频率,并且所讨论的机制在设计时就考虑到了这种低更改率。
组件配置情况有哪些类型?
每种需要组件配置的情况都不尽相同。本部分将介绍在调查需要配置的情况时,您需要问自己的一些关键问题。这些问题的答案有助于您选择合适的配置机制。
谁设置数据?
- 组件开发者。在这里,组件的开发者会提供配置值。例如,一组值用于测试,另一组值用于生产环境,或者为每种 build 类型设置不同的值。
- 产品集成商。在这里,开发者负责根据特定产品或开发板将组件与特定产品或开发板供电配置值集成。这些人可能是开发组件的人。
- 车队经理。在这里,负责管理设备车队的团队会提供配置值。例如,如果发布时出现问题,停用功能标志。
- 设备管理员。此处,管理设备的人员或组织会提供值。例如,启用新的实验性功能。对于开发设备,管理员是使用相应设备的开发者。如果基于 Fuchsia 的产品支持企业用例,则设备的所有者企业可以充当设备管理员。
- 最终用户。在这里,设备的最终用户会提供值,例如在设置流程中设置设备的地区。
同一配置数据可能需要由多个这些角色设置,并且在不同情况下可能由不同的角色设置。例如,某项功能可能已被产品集成商在某个产品中停用,但管理员可以在其他产品中进行设置。
数据何时会修正?
- 已在发布时修复。如果配置数据只能由组件开发者或产品集成商(在某些情况下为车队管理员)更改,则在产品发布时,该数据将固定不变。这意味着,发布流程可以在签名之前验证配置。例如,Fuchsia 团队可以验证调试选项在正式版中始终处于停用状态。
- 可在运行时修改。可由设备管理员或最终用户(在某些情况下为车队管理员)更改的配置数据必须能够在设备运行时更改。
在某些产品或 build 类型中,相同的配置数据在发布时可能固定,但在其他产品或 build 类型中可能可在运行时修改。
有多少个组件使用这些数据?
- 一个组件。在大多数情况下,只有一个组件需要使用配置数据。该组件的开发者可以定义数据,并且配置可以根据需要与组件实现紧密耦合。
- 多个组件。在某些情况下,多个组件需要共享相同的配置数据,例如,多个不同的组件可能需要知道一组已获批准的 SSL 根密钥。
组件的实例是否具有不同的配置?
- 否。此处只有一个组件实例,或者有多个组件实例,且这些实例始终使用相同的配置值。例如,读取开发板架构的设备上的所有组件实例都应收到相同的值。
- 是。在更复杂的情况下,需要为同一组件的不同实例提供不同的配置值。这在集成测试中很常见。例如,与在生产环境中运行时相比,在集成测试中运行组件实例时,超时值可能需要更低。
数据有多大?
- 小。大多数组件的配置数据大小较小或中等;几字节到几十千字节。一个典型的示例是,某个组件需要使用少量整数来配置其性能,以及使用几十个布尔值来启用实验或功能。
- 大。在某些情况下,配置数据会大得多,以兆字节为单位。例如,传感器的校准映射或大型机器学习模型的参数。