| RFC-0233:默认使用旧版 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=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(fidlc 编译错误,或绑定中未使用的 API)的后果要严重得多。所有这些都表明默认值应翻转。
利益相关方
教员: 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 替换默认值。
实现
更改所有 FIDL 文件,以便在所有没有
legacy=true的removed元素上明确指定legacy=false。暂时将
legacy作为removed元素的必需实参。 如果 (1) 遗漏了任何内容,CQ 将在此处失败。再次将
legacy设置为可选,并默认使用 true。更改所有 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
文档
必须更新以下文档页面:
缺点、替代方案和未知事项
替代方案:为 removed 和 replaced 设置不同的默认值
根据此提案,交换元素将需要编写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 版本控制替换语法 也被接受,我们
可以将默认值设置为 true,将 replaced 的默认值设置为 false。removed
替代方案:移除 legacy 实参
有了新的默认值,为什么还要保留 legacy 实参?使用 legacy=false 移除元素有三种用例:
在某些情况下,移除灵活数据结构的成员。考虑移除表字段。如果支持旧版的组件只是忽略该字段,则它不需要在
LEGACY中为其绑定。放弃对旧版 API 级别的支持并移除实现。
用例 (2) 可能很少见,而且并不重要。对于此类成员,拥有未使用的 LEGACY 绑定并没有什么害处。
用例 (3) 是真实的,但我们可以直接从 FIDL 文件中删除代码,而不是使用 legacy=false。这意味着我们将无法再为旧版 API 级别重新生成文档,但我们可以存储预生成的文档。
替代方案:将 LEGACY 替换为目标/最低级别
请参阅 https://fxrev.dev/ TODO
在先技术和参考文档
我没有研究这方面的在先技术,因为它只是一个更改默认值的提案。