| 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
既有技術與參考資料
我沒有查看這方面的先前技術,因為這只是變更預設值的提案。