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)严重得多。所有这些都表明,默认值应改为 legacy=true
。
利益相关方
主持人: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 版本替换语法,我们可以将 removed
的默认值设为 true,将 replaced
的默认值设为 false。
替代方案:移除 legacy
参数
既然有新的默认值,为什么还要保留 legacy
实参?使用 legacy=false
移除元素有以下三种用例:
在某些情况下,移除灵活数据结构的成员。考虑移除表格字段。如果支持旧版的组件会直接忽略该字段,则无需在
LEGACY
中为其绑定。弃用对旧版 API 级别的支持并移除相应实现。
用例 (2) 可能很少见,并且不是必需的。为此类成员保留未使用的 LEGACY
绑定没有太大影响。
使用情形 (3) 是真实的,但我们可以直接从 FIDL 文件中删除代码,而不是使用 legacy=false
。这意味着,我们无法再为旧版 API 级别重新生成文档,但可以改为存储预生成的文档。
替代方案:将 LEGACY
替换为目标/最低级别
请参阅 https://fxrev.dev/ TODO
在先技术和参考文档
我没有研究过这方面的先前技术,因为这只是更改默认值的提案。