| RFC-0233:預設使用舊版 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 覆寫預設值。
實作
將所有 FIDL 檔案變更為在沒有
legacy=true的所有removed元素上明確指定legacy=false。暫時將
legacy設為removed元素的必要引數。 如果 (1) 錯過任何內容,CQ 就會在這裡失敗。再次將
legacy設為選用欄位,並預設為 true。變更所有 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 移除元素有三種用途:
在某些情況下,移除彈性資料結構的成員。請考慮移除資料表欄位。如果支援舊版的元件只會忽略該欄位,則不需要在
LEGACY中為該欄位建立繫結。停止支援舊版 API 級別並移除實作項目。
使用案例 (2) 可能很少見,而且並非必要。如果這類成員有未使用的 LEGACY 繫結,不會造成太大危害。
用例 (3) 是真實案例,但我們可以直接從 FIDL 檔案中刪除程式碼,而不是使用 legacy=false。這表示我們無法再重新產生舊版 API 級別的說明文件,但可以改為儲存預先產生的說明文件。
替代做法:將 LEGACY 替換為目標/最低等級
請參閱 https://fxrev.dev/ TODO
既有技術和參考資料
我沒有研究這項技術的先前技術,因為這只是變更預設值的提案。