RFC-0233:默认使用旧版 FIDL

RFC-0233:默认使用旧版 FIDL
状态已拒绝
领域
  • FIDL
说明

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

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

拒绝原因

此 RFC 已遭拒,取而代之的是 RFC-0232:适用于多个 API 级别的 FIDL 绑定。这两种方案都旨在弥补 legacy 功能的缺点。此版本带来了增量改进,而 RFC-0232 完全放弃了该功能,用更好的功能取而代之。legacy 停用后,此 RFC 不再相关。

总结

更改 FIDL @available 属性以将 legacy=true 设为默认属性,这样就需要 legacy=false 才能选择停用 LEGACY

背景

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

为了解决此问题,我们修订了 RFC-0083,以引入 LEGACY 版本和 legacy 参数。LEGACY 版本与 HEAD 类似,只不过它会重新添加标记为 legacy=true 的元素。

设计初衷

移除 FIDL API 时,人们对是否应编写 legacy=true 感到困惑。答案是:几乎总是可以,除非您进行交换。此外,错误使用 legacy=false(ABI 损坏)造成的后果比 legacy=true(Fildc 编译错误或绑定中未使用的 API)严重得多。所有这些都表明应该翻转默认值。

利益相关方

教员:abarth@google.com

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

咨询人员:wez@google.com、sethladd@google.com、wilkinsonclay@google.com

社交:在撰写 RFC 之前,我与 FIDL 团队和平台版本控制工作组讨论了这一想法。

设计

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

实现

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

  2. 暂时将 legacy 设为 removed 元素的必需参数。如果 (1) 错过了任何问题,CQ 将失败。

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

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

性能

此提案对效果没有影响。

工效学设计

此方案使 FIDL 版本控制更易于使用。特别是,它消除了在移除元素时忘记编写 legacy=true 的误区。

向后兼容性

此方案有助于实现 ABI 向后兼容性,因为它要求停用而不是启用 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) 是真实的,但我们只需从 FIDL 文件中删除代码即可,而无需使用 legacy=false。这意味着,我们无法再为旧 API 级别重新生成文档,但可以存储预生成的文档。

替代方案:将 LEGACY 替换为目标/最低级别

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

早期技术和参考资料

我没有调查先前的技术,因为这只是一项更改默认值的建议。