RFC-0233:默认使用旧版 FIDL

RFC-0233:默认情况下为 FIDL 旧版
状态已拒绝
领域
  • FIDL
说明

更改 @available 属性,将 legacy=true 设置为已移除元素的默认值

Gerrit 更改
作者
提交日期(年-月-日)2023-08-23
审核日期(年-月-日)2023-10-24

拒绝理由

此 RFC 被拒绝,取而代之的是RFC-0232:针对多个 API 的 FIDL 绑定 级别。这两种方案的目的是解决 legacy 功能。这种方式带来了更好的效果, RFC-0232 彻底去除了此功能,用更好的形式取而代之。 legacy 消失后,此 RFC 不再相关。

摘要

更改 FIDL @available 属性以将 legacy=true 设为默认属性, 如需选择不将LEGACY纳入其中,必须添加legacy=false

背景

使用 FIDL 版本控制的原始设计时,无法删除 同时保留对其的 ABI 支持。例如,如果 CL 标记了某个方法, 设为 removed=5,还必须删除该方法的实现。 这是因为我们在 HEAD 中构建了 Fuchsia 平台,而该方法的服务器 绑定在 HEAD 大于 5 时将不再存在。

为了解决这个问题,我们修订了 RFC-0083, LEGACY 版本和 legacy 参数。LEGACY 版本类似于 HEAD, 不过,如果已移除的元素标记为 legacy=true,它会重新添加这些元素。

设计初衷

用户不知道在移除时是否应写入 legacy=true FIDL API。答案是:几乎所有情况下,除非您进行交换。此外, 不正确使用 legacy=false 的后果(ABI 损坏)要严重得多 高于 legacy=true(保真编译错误或绑定中未使用的 API) 所有这些都表明应翻转默认值。

利益相关方

教员:abarth@google.com

审核者:hjfreyer@google.com、ianloic@google.com

已咨询:wez@google.com、sethladd@google.com、wilkinsonclay@google.com

社交化:我与 FIDL 团队和平台讨论了这一想法 在编写 RFC 之前对版本控制工作组进行命名。

设计

对于以下参数,将 @available 属性的 legacy 参数默认更改为 true removed 元素。允许 legacy=false 覆盖默认值。

实现

  1. 更改所有 FIDL 文件,以在所有 removed 上明确指定 legacy=false 元素不包含 legacy=true

  2. 暂时将 legacy 设为 removed 元素的必需参数。 如果 (1) 遗漏了任何内容,则 CQ 将失败。

  3. legacy 再次设置为可选,并默认设置为 true。

  4. 更改所有 FIDL 文件以移除出现的 legacy=true

性能

此提案对效果没有影响。

工效学设计

此方案使 FIDL 版本控制更易于正确使用。具体而言, 消除了在移除 activity 时忘记写入 legacy=true 的误区 元素。

向后兼容性

此方案有助于实现 ABI 向后兼容性,因为它使 语法。

安全注意事项

此方案对安全性没有影响。

隐私注意事项

此方案对隐私权没有任何影响。

测试

必须更新以下文件以测试新行为:

  • tools/fidl/fidlc/tests/availability_interleaving_tests.cc
  • tools/fidl/fidlc/tests/decomposition_tests.cc
  • tools/fidl/fidlc/tests/versioning_tests.cc
  • tools/fidl/fidlc/tests/versioning_types_tests.cc

文档

必须更新以下文档页面:

缺点、替代方案和未知问题

替代方案:removedreplaced 的默认值不同

根据此方案,交换元素需要写入 legacy=false。 例如,如需在版本 10 中将枚举从严格更改为柔性,请使用以下代码:

@available(removed=10, legacy=false)
type Foo = strict enum { VAL = 1; };

@available(added=10)
type Foo = flexible enum { VAL = 1; };

如果还接受 RFC-0231: FIDL 版本控制替换语法,我们 可将 removed 的默认值设为 true,将 replaced 设为默认值 false。

替代方案:移除 legacy 参数

使用新的默认值,为什么要保留 legacy 参数?它有三种用途 使用 legacy=false 移除元素的情形:

  1. 交换上述替代方案解决了此问题。

  2. 在某些情况下,移除灵活数据结构的成员。考虑 移除表格字段。如果支持旧版的组件 忽略该字段,则不需要在 LEGACY 中为该字段进行绑定。

  3. 不再支持旧 API 级别并移除该实现。

用例 (2) 可能很少见,也不是必需的。这里没什么危害 为此类成员设置未使用的 LEGACY 绑定。

用例 (3) 确实存在,但我们可以直接删除代码,而不是 legacy=false 从 FIDL 文件中提取。这意味着,我们无法再为 但我们可以存储预先生成的文档。

替代方案:将 LEGACY 替换为目标值/最低水平

请参阅 https://fxrev.dev/ TODO

先验技术和参考资料

我没有对此进行调查,因为这只是一个提议更改 默认值。