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 平台,而方法的伺服器繫結會因為大於 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
覆寫預設值。
實作
變更所有 FIDL 檔案,在所有沒有
legacy=true
的removed
元素上明確指定legacy=false
。暫時將
legacy
設為removed
元素的必要引數。如果 (1) 遺漏任何內容,CQ 就會失敗。再次將
legacy
設為選用,並設為預設值。變更所有 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
既有技術與參考資料
我沒有查看這方面的先前技術,因為這只是變更預設值的提案。