RFC-0233:預設舊版 FIDL

RFC-0233:預設使用舊版 FIDL
狀態已遭拒
區域
  • 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 引數預設設為 true,適用於 removed 元素。允許 legacy=false 覆寫預設值。

實作

  1. 將所有 FIDL 檔案變更為在沒有 legacy=true 的所有 removed 元素上明確指定 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

說明文件

必須更新下列文件頁面:

缺點、替代方案和未知事項

替代做法:為「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 移除元素有三種用途:

  1. 交換上述替代方案可解決這個問題。

  2. 在某些情況下,移除彈性資料結構的成員。請考慮移除資料表欄位。如果支援舊版的元件只會忽略該欄位,則不需要在 LEGACY 中為該欄位建立繫結。

  3. 停止支援舊版 API 級別並移除實作項目。

使用案例 (2) 可能很少見,而且並非必要。如果這類成員有未使用的 LEGACY 繫結,不會造成太大危害。

用例 (3) 是真實案例,但我們可以直接從 FIDL 檔案中刪除程式碼,而不是使用 legacy=false。這表示我們無法再重新產生舊版 API 級別的說明文件,但可以改為儲存預先產生的說明文件。

替代做法:將 LEGACY 替換為目標/最低等級

請參閱 https://fxrev.dev/ TODO

既有技術和參考資料

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