RFC-0233:預設的舊版 FIDL | |
---|---|
狀態 | 已遭拒 |
區域 |
|
說明 | 變更 @available 屬性,將 legacy=true 設為已移除元素的預設值 |
變更 | |
作者 | |
提交日期 (年/月) | 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
覆寫預設值。
實作
變更所有 FIDL 檔案,在不含
legacy=true
的所有removed
元素上明確指定legacy=false
。暫時將
legacy
設為removed
元素的必要引數。如果 (1) 缺少任何項目,CQ 就會失敗。將
legacy
再次設為選填,且預設為 true。變更所有 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
說明文件
以下說明文件頁面必須經過更新:
缺點、替代方案和未知
替代選項: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) 是真實的,但我們可以直接從 FIDL 檔案中刪除程式碼,而不是 legacy=false
。這表示我們無法再重新產生舊 API 級別的說明文件,但可以改為儲存預先產生的說明文件。
替代方法:將 LEGACY
替換為目標/最低級別
詳情請參閱 https://fxrev.dev/ TODO
先前的圖片和參考資料
我並未研究先前的技術,因為這只是變更預設值的提案。