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 平台,而方法的伺服器繫結會因為大於 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 團隊和平台版本工作小組討論過這個想法。

設計

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

實作

  1. 變更所有 FIDL 檔案,在所有沒有 legacy=trueremoved 元素上明確指定 legacy=false

  2. 暫時將 legacy 設為 removed 元素的必要引數。如果 (1) 遺漏任何內容,CQ 就會失敗。

  3. 再次將 legacy 設為選用,並設為預設值。

  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

說明文件

下列說明文件頁面必須更新:

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

替代做法:為 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

既有技術與參考資料

我沒有查看這方面的先前技術,因為這只是變更預設值的提案。