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
纳入其中,必须添加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
覆盖默认值。
实现
更改所有 FIDL 文件,以在所有
removed
上明确指定legacy=false
元素不包含legacy=true
。暂时将
legacy
设为removed
元素的必需参数。 如果 (1) 遗漏了任何内容,则 CQ 将失败。将
legacy
再次设置为可选,并默认设置为 true。更改所有 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
文档
必须更新以下文档页面:
缺点、替代方案和未知问题
替代方案: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) 确实存在,但我们可以直接删除代码,而不是 legacy=false
从 FIDL 文件中提取。这意味着,我们无法再为
但我们可以存储预先生成的文档。
替代方案:将 LEGACY
替换为目标值/最低水平
请参阅 https://fxrev.dev/ TODO
先验技术和参考资料
我没有对此进行调查,因为这只是一个提议更改 默认值。