RFC-0233:默认使用旧版 FIDL

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

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

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

拒绝理由

此 RFC 已被拒绝,取而代之的是 RFC-0232:针对多个 API 级别的 FIDL 绑定。这两项提案的目标都是为了解决 legacy 功能的不足之处。RFC-0231 提供了增量改进,而 RFC-0232 则完全摒弃了该功能,并用更好的功能取而代之。随着 legacy 的消失,此 RFC 不再相关。

摘要

更改 FIDL @available 属性,使 legacy=true 成为默认值,这样就需要 legacy=false 来选择不包含 LEGACY

背景

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

为了解决这个问题,我们修订了 RFC-0083,引入了 LEGACY 版本和 legacy 实参。LEGACY 版本与 HEAD 类似,但如果移除的元素标记为 legacy=true,则会重新添加这些元素。

设计初衷

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

利益相关方

Facilitator: abarth@google.com

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

咨询对象:wez@google.com、sethladd@google.com、wilkinsonclay@google.com

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

设计

@available 属性的 legacy 实参更改为默认对 removed 元素为 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

在先技术和参考资料

我没有研究这方面的现有技术,因为这只是一个更改默认值的提案。