RFC-0233:預設舊版 FIDL

RFC-0233:預設使用 FIDL 舊版
狀態已遭拒
領域
  • FIDL
說明

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

毛皮變化
作者
提交日期 (年-月-日)2023-08-23
審查日期 (年-月-日)2023 年 10 月 24 日

拒絕原因

這個 RFC 遭到拒絕,改用 RFC-0232: FIDL 繫結至多個 API 層級。這兩項提案的目標,都是為瞭解決 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 的元素。

提振精神

使用者不清楚是否應該在移除時編寫「legacy=true」 FIDL API答案是:幾乎總是,除非你更換了。此外 錯誤使用 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

社交:我與 FIDL 團隊和平台討論了這個想法 在寫入 RFC 之前的版本管理工作群組。

設計

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

實作

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

  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

說明文件

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

缺點、替代方案和未知

替代做法: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) 是真實的,但我們可以直接刪除程式碼,而不是 legacy=false FIDL 檔案這表示我們無法再重新產生 但可以改為儲存預先產生的說明文件

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

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

既有藝術品和參考資料

我不看相關技術,因為這只是改變提案的提案 預設值。