RFC-0233:預設舊版 FIDL

RFC-0233:預設的舊版 FIDL
狀態已遭拒
區域
  • FIDL
說明

變更 @available 屬性,將 legacy=true 設為已移除元素的預設值

變更
  • 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 平台,而由於該平台超過 5 個,因此該方法的伺服器繫結也不再存在 HEAD 中。

為解決這個問題,我們「修訂」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 團隊和 Platform 版本管理工作團隊討論這個構想。

設計

removed 元素的 @available 屬性的 legacy 引數預設為 true。允許 legacy=false 覆寫預設值。

實作

  1. 變更所有 FIDL 檔案,在不含 legacy=true 的所有 removed 元素上明確指定 legacy=false

  2. 暫時將 legacy 設為 removed 元素的必要引數。如果 (1) 缺少任何項目,CQ 就會失敗。

  3. legacy 再次設為選填,且預設為 true。

  4. 變更所有 FIDL 檔案,移除 legacy=true 的例項。

效能

這項提案不會影響成效。

人體工學

本提案可讓您更輕鬆地使用 FIDL 版本管理。具體來說,這個 API 消除了在移除元素時忘記寫入 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

先前的圖片和參考資料

我並未研究先前的技術,因為這只是變更預設值的提案。