RFC-0166:單一 UI 堆疊

RFC-0166:One UI 堆疊
狀態已接受
區域
  • 圖形
  • HCI
  • 查看系統
說明

說明所有 Fuchsia 產品移至單一圖形和輸入堆疊的計畫和政策。

問題
Gerrit 變更
作者
審查人員
提交日期 (年-月-日)2022-05-04
審查日期 (年-月-日)2022-06-03

摘要

本 RFC 會針對 Fuchsia 平台中圖形、輸入和無障礙堆疊 (也稱為「UI 堆疊」) 所使用的舊版元件和 API,說明記錄計畫。這份文件概述了遷移作業的預定順序,以便使用相同的圖形、輸入和無障礙功能堆疊,取得所有 Fuchsia 產品設定。並說明這些轉換的測試標準。具體違規事項如下:

  • 根呈現工具元件已淘汰,請改用場景管理工具。
  • 在含有圖形的產品上,輸入管道程式庫會做為場景管理員的一部分執行。
  • 平台整合測試應涵蓋 UI 元件之間的所有合約,以確保轉換過程中的行為一致。
  • Scenic 的 GFX API 已淘汰,改用 Flatland。

提振精神

Fuchsia 平台目前提供多種

  • 處理使用者輸入內容
  • 建立圖形場景
  • 連接無障礙服務

不同的 Fuchsia 產品設定目前使用這項功能的不同子集。這會導致不同產品之間的混淆和偵錯困難。

這份 RFC 旨在釐清哪些元件和 API 已淘汰,哪些是已記錄的計畫,並核准遷移作業的預定順序。這份文件會針對 RFC-0096:使用者輸入架構RFC-0147:View 系統 中討論的架構提供更多背景資訊。

相關人員

誰會受到這項 RFC 是否通過的影響?(此為選用部分,但建議您填寫)。

協助人員:

cpu@google.com

審查者:

  • Scenic、執行階段整合:emircan@google.com、jjosh@google.com、dworsham@google.com
  • 無障礙工具:lucasradaelli@google.com
  • 輸入:quiche@google.com、jaeheon@google.com

諮詢:

yeg@google.com

社會化:

我們已與 Scenic、輸入和無障礙團隊內部審查這項計畫的詳細版本。

詞彙解釋

  • Scenic:Fuchsia 平台元件,可處理圖形合成、焦點管理和圖形輸入路由。fuchsia.ui.scenicfuchsia.ui.gfx
  • Flatland - 記錄 Scenic API 的計畫。位於 fuchsia.ui.composition 中。
  • 輸入管道 - Fuchsia 程式庫,可處理輸入事件的路由和政策。可做為場景管理工具的一部分或獨立元件執行。
  • Scene Manager:Fuchsia 平台元件,可處理 Scenic 場景的設定和配置,以及啟動輸入管道。目前缺少部分功能,尤其是無障礙功能。
  • Root Presenter:舊版 Fuchsia 平台元件,可處理輸入路由,以及 Scenic 場景的設定和設定。
  • 無障礙服務管理工具:處理無障礙服務的 Fuchsia 平台元件。

設計

舊版與所需狀態

這張圖表顯示舊版與所需 UI 堆疊的差異,如下所述

在舊版 UI 堆疊中,Root Presenter 負責解析來自驅動程式庫堆疊的輸入事件,並使用 GFX 將場景圖表例項化。根呈現工具會將輸入事件調度至 Scenic,而 Scenic 有時會將事件轉送至無障礙管理工具。Root Presenter 會將指令傳送至無障礙服務管理工具,以便控制放大和色彩校正。Flutter 和 Chromium 會使用 GFX 建立檢視畫面。

在理想/未來的 UI 堆疊中,場景管理工具負責解讀來自驅動程式庫堆疊的輸入事件,並使用 Flatland 將場景圖表例項化。輸入管道會以 Scene Manager 元件的一部分進行例項化,並將輸入事件調度至 Scenic。Scenic 有時會將輸入事件轉送至 Accessibility Manager。場景管理員會將指令傳送至無障礙管理員,以便控制放大和色彩校正。Flutter 和 Chromium 會使用 Flatland 建立檢視畫面。虛擬鍵盤控制器是個別元件,只負責傳遞有關螢幕鍵盤狀態的訊息。

異動內容

淘汰 Root Presenter

根呈現工具將移除場景管理和輸入功能,並改名為「虛擬鍵盤管理工具」,以反映其餘功能。這麼做可移除大量未經測試的舊版程式碼。

任何目前未在場景管理工具中支援的 Root Presenter 功能 (例如輔助工具放大功能) 都會在場景管理工具中實作。

整合測試

如今,UI 堆疊的所有功能 (圖形、不同形式的使用者輸入、無障礙功能) 都需要進行密封整合測試,以確保平台元件之間的合約保持穩定。

將 GFX 轉換為 Flatland

所有 GFX API 的參照和實作項目都會從 fuchsia.git 中移除。GFX 是舊版 3D API,其複雜度遠高於 Fuchsia 目前提供的用途所需。移除這項功能可簡化系統,並移除不易理解的 API 途徑。

這也讓執行階段實作 (Flutter、Chromium) 能夠從程式碼集移除 GFX 支援。

淘汰順序

如要將所有產品移至相同的理想設定,我們必須變更元件拓撲 (以場景管理工具取代根顯示器) 和使用的 API (GFX 與 Flatland)。為了為圖形 API 轉換提供完善的測試涵蓋率,我們會先將所有產品對齊至正確的元件拓撲。完成後,我們會將 GFX 上剩餘的所有產品轉移至 Flatland。

實作

在所有階段,遷移作業都應透過建構標記控管,以便輕鬆進行手動測試和復原。

里程碑 0 (已完成):僅在工作站上使用 Flatland

工作站設定已於 2022 年第 1 季改用 Flatland for Graphics。

里程碑 1 (已完成):其他產品移至輸入管道

自 2022 年第 2 季起,所有其他 Fuchsia 產品都已改用輸入管道來處理輸入事件路由 (而非根呈現工具)。在沒有 Scene Manager 的產品中,此元件會暫時以獨立元件的形式執行。

里程碑 2:將所有產品轉移至 Scene Manager

目前 Scene Manager 缺少 Root Presenter 中的多項功能。如要讓 Scene Manager 與 Root Presenter 的功能相容,請前往 https://fxbug.dev/42181047 追蹤相關進度。完成這項作業並完成所有功能的平台整合測試後,我們會將所有剩餘產品轉換為使用 Scene Manager + GFX。

轉換完成後,Root Presenter 中的輸入和場景管理程式碼就會移除。Root Presenter 的虛擬鍵盤控制器功能將保留,且元件會重新命名,以反映其減少的責任。

里程碑 3:將剩餘產品轉移至 Flatland

Flatland 還有其他工作,可涵蓋 GFX 支援的所有功能。這項工作已在 https://fxbug.dev/42175822 中追蹤。這項工作完成後,平台整合測試將涵蓋所有測試項目,我們會將剩餘的產品轉移至 Flatland。

這項功能穩定上線後,我們可能會移除 GFX 的 API 和實作方式。請注意,這包括 Scenic 元件中的程式碼,以及多個 UI 架構中的整合程式碼。

成效

里程碑 3 可改善某些產品設定的效能,因為 Flatland 可提高效率。這項功能可在 Flatland 能夠將合成作業委派給顯示器控制器 (即不涉及 GPU) 時使用,這項功能可在部分裝置類型上使用。您應監控每個轉換作業的成效,但成效不應惡化。

安全性和隱私權考量

這個 RFC 不會引入任何新的安全性或隱私權疑慮,這些疑慮已在 Flatland API 審查中涵蓋。系統不會收集任何使用者資料。

測試

在遷移的每個階段,我們會根據受影響功能的完整整合測試涵蓋率,限制遷移作業。由於 Root Presenter 先前缺乏這類涵蓋率,因此這項功能應可整體改善 UI 堆疊的涵蓋率。

說明文件

隨著里程碑完成,說明文件應移除 Root Presenter 和 GFX 的參照。

缺點、替代方案和未知事項

這是一項複雜的多季遷移作業,需要工程團隊投入大量心力才能完成。

不執行任何動作

我們會持續維護舊版功能,直到所有使用這項功能的產品都停產為止。由於平台其他部分持續變更,且缺乏全面測試,因此這項維護作業在過去一直是相當重大的作業。多個 UI 堆疊也會造成混淆,導致無法確定特定產品實際執行的程式碼為何。雖然遷移作業成本高昂,但維持現狀需要花費更多心力,且會導致成效不佳和工程速度降低。

先轉換至 Flatland

這種做法需要大量工作,才能為 Root Presenter 新增 Flatland 支援。由於此程式碼缺乏全面的測試涵蓋率,因此風險較高,且需要大量的廢棄工作。

既有技術與參考資料