0%

【文章翻譯】Providing operating system compatibility on a large scale

【文章內容使用 Gemini 1.5 Pro 自動產生】

大規模提供作業系統相容性

使用 Flutter 編寫的應用程式可以在 Android、iOS、網頁和桌面作業系統上運行。由於我們在支援多個平台方面的投入,Flutter 應用程式可以在任何具有應用程式編寫時所用作業系統版本(或更高版本)的設備上運行,而無需進行任何修改,這擴展了 Flutter 的跨平台吸引力。

在本文中,Flutter 的核心開發團隊(我們)想要分享我們為何投資於支援多個平台,我們如何才能繼續支援多個平台,以及在需要新增對新平台的支援或停止支援舊平台時,我們如何做出決定。

展望未來:Android 和 iOS 的版本

Flutter 致力於為 Android 和 iOS 的最新功能提供完全支援。我們始終監控著 Apple 和 Google 發布的有關其平台 API、工具使用和授權條款變更的定期指南。對新作業系統版本的支援是我們定期產品規劃的一部分,我們會盡量將我們的版本與 Google 和 Apple 的最新指南保持一致,以確保我們的穩定版本始終與兩者的最新指南相容。

我們承諾對您提供多個平台和 Android 和 iOS 的軟體版本(例如 Android 11 或 iOS 14)以及其小版本更新的支援。對於目標平台的主要修訂,我們會在了解到所需內容後立即開始開發必要的功能和更改。這通常發生在春季後期,Google 公佈了其即將發佈的 Android 版本的計劃,而 Apple 在其全球開發者大會 (WWDC) 上發布了最新公告。在發布公告之後,我們會評估 Flutter 程式碼庫中必要的更改,例如由於可能已棄用的 API 導致的引擎更改,工具更改如何影響 flutter 工具和開發人員體驗,以及兩者的設計語言更改。我們還會評估工作範圍,預期這兩個平台都将在秋季初提供給客戶。

我們會針對 Android 和 iOS 的測試版進行這項工作,並會透過我們的 master、dev 和 beta 頻道定期提供這些更改。master 頻道的版本是持續性的。我們計劃每週發佈兩到三個 dev 頻道版本(針對 Google 內部應用程式和測試套件進行測試的 master 頻道版本)。beta 頻道通常在每月的第一週發佈。我們會使用 GitHub 問題追蹤我們的進度。若要查看問題清單,您可以根據 platform-iosplatform-android 搜尋。

將我們的穩定版本發佈時間表與 iOS 保持一致尤其具有挑戰性,因為從新聞發佈到我們獲得有關作業系統更改的指南之間的時間通常非常短。我們會透過在秋季規劃我們的其中一個版本,並準備好針對 iOS 或甚至 Android 上出現的任何阻礙性錯誤對我們目前的穩定版本進行熱修復來減輕這一挑戰。(這發生在 Flutter 1.20 和 iOS 14 上,我們在 iOS 14 發佈的同一天發布了 熱修復)。

無論支援新平台版本需要做多少工作,我們的目標都是支援目標平台的新版本,而不棄用舊版本。

向後相容性和 Flutter 的價值主張

Flutter 是 Google 的可移植 UI 工具包,用於從單一程式碼庫建立針對行動、網頁和桌面的精美的原生編譯應用程式。為此,我們希望支援我們可以支援的最廣泛的設備集合,而不仅仅是特定類型的平台。我們還希望支援最多數量的平台版本。

以 Android 為例:根據 statcounter,截至 2020 年 6 月,市面上的 Android 版本如下所示:

從數字來看,Android KitKat (Android 4.x) 的市場佔有率不到 2%。絕大多數 Android 設備 (54%) 正在運行 Android Pie (Android 9.0) 或 Android 10。支援每個版本的 Android 都需要投資。您知道我們為何要投資於像 KitKat 這樣市場佔有率低於 2% 的平台嗎?

答案很簡單:淨數字。由於超過 10 億台 Android 設備沒有運行 Android Pi 或更高版本,我們希望確保 Flutter 尽可能广泛地得到使用。我們還希望支援多元的全球使用者群。而且,由於 Android 和 iOS 的舊版本經常被開發中國家的使用者使用,我們希望在尽可能長的時間內避免停止支援舊版本。

透過 Flutter 的核心引擎、框架和 Plugin 中的工作,Flutter 為作業系統平台和作業系統版本的各種問題提供了抽象。例如,Material 應用程式可以在舊版本的 iOS 或 Android 上運行,而无需進行任何修改。事實上,開發人員已發佈在與第一個版本同時推出的硬體上運行的商業 Material 應用程式,而使用這些設備附帶的 Widget 集,則無法在這些設備上執行 。Plugin 也有類似的案例。Plugin 會抽象化平台和版本差異,讓您可以專注於重要的部分:您的應用程式。

Flutter 如何支援如此多的目標

Flutter 為多目標支援帶來了兩大優勢。首先,Flutter 對底層作業系統的依賴性很小。Flutter 的引擎直接與圖形 API 互動,Plugin 為其他功能提供了大部分的設備特定實作。

我們的持續整合 (CI) 系統會為 macOS、Linux 和 Windows 建立 Flutter 及其工具,並部署到一系列 Android 和 iOS 設備(實體設備和模擬設備)。部分 CI 是使用 Google 辦公室中的實驗室進行的;其他 CI 測試是在 Firebase 測試實驗室 上進行的,這是 Google 為 Google 和第三方開發人員運營的雲端託管測試解決方案。

以下是一張我們測試實驗室中其中一個機架的照片:

我們在設備實驗室中運行相對低端的行動設備,因為我們會在那裡進行 效能測試。在測試時,我們希望從代表大多數使用者擁有的設備中獲取效能指標。這樣做可以讓我們獲得最糟糕的情況、真實世界的效能。這種理念也適用於核心工程團隊使用的設備。核心工程團隊的大部分成員並沒有在最新的 Google Pixel 或 Apple iPhone 上進行 Flutter 除錯。

由於我們想要測試許多類型的行動設備,因此我們會保留一個設備庫,核心工程團隊的成員可以在其中檢出特定設備以進行測試和除錯。(在新冠肺炎疫情期間,我們充分利用了美國郵政服務!)

由於實驗室只能測試少數幾種設備類型和版本,我們如何確保我們正在提供我們聲稱提供的支援?請繼續閱讀以瞭解。

對平台版本支援做出一般性斷言

首先也是最重要的是,我們會針對每個程式碼提交在各種平台上進行測試。

在我們目前的實驗室中,我們正在以下 Android 平台上進行測試:

  • Android API 24 (Android N)
  • Android API 28 (Android P)
  • Android API 29 (Android 10)

這涵蓋了已部署 Android 版本市場的 57%;稍後,我們會說明如何透過使用 Firebase 測試實驗室來涵蓋剩餘的設備。

我們的實驗室還會針對每個提交在運行以下作業系統的設備上測試 iOS:

  • iOS 9.3.6
  • iOS 12.4
  • iOS 12.4.1
  • iOS 13.1.3
  • iOS 13.2

最後,對於桌面和網頁,我們會針對每個提交在以下設備上進行測試:

  • Chrome 84
  • Firefox 72.0
  • Catalina 上的 Safari
  • Edge 1.2.0.0
  • Windows 10
  • macOS El Capitan
  • Debian 10

很明顯,Android 方面需要進行更多測試。我們依賴於 Firebase 測試實驗室 完成這項工作,測試以下額外的 Android 和 iOS 組態:

  • Android API 19 (Android K)
  • Android API 21 和 22 (Android L)
  • Android API 23 (Android M)
  • Android API 26 和 27 (Android O)
  • Android API 30 (Android 11)
  • iOS 11
  • iOS 13.0
  • iOS 13.1
  • iOS 13.3–13.7
  • iOS 14

總體而言,我們對 Android 和 iOS 平台的測試涵蓋了目前發佈版本中的 95% 以上。

對於其他作業系統版本,我們透過 您的 支援,也就是 Flutter 開發社群,提供向後相容性。這對特定的設備/作業系統組合尤其適用。你們中許多人使用我們無法使用到的設備:可能是因為你們的作業系統版本我們沒有,或是因為這些設備在美國無法取得。在某些情況下,我們可以減輕這種情況。例如,我們可以在一些 Google Pixel 硬體上刷入較舊的 Android 版本,購買較舊的翻新 iOS 設備,或在模擬器中運行 Android 版本。在許多情況下,你們中的一個人提交的報告會觸發我們對特定平台問題的調查。

這對許多 Android 設備的原始設備製造商 (OEM) 尤其適用。OEM 通常會對 Android 的某些方面進行自訂,例如鍵盤支援。過去,由於你們的幫助,我們能夠修復許多僅在某些市場的某些設備上發生的文字輸入問題。

我們感謝您的幫助,因為我們不可能自己找到所有問題,但我們會努力降低注入問題的風險。在進行程式碼更改時,我們會謹慎行事,並注意作業系統的最早版本支援哪些功能。在需要支援不連貫的組態時,我們會提供選項。這就是為什麼您可以使用 OpenGL 或 Metal 建立 iOS 應用程式,Flutter 會在運行時自動選擇其中之一。

由於這些原因,儘管我們會盡力支援作業系統版本上的測試,但我們支援的一些設備是基於「盡力而為」的基礎支援的。我們會嘗試撰寫支援我們聲稱支援的平台的程式碼,我們會依賴團隊對設備多樣性的隨機使用承諾,然後會尋求社群的回饋,以了解我們在實際使用中表現如何。

我們需要您幫助測試屬於「盡力而為」類別的設備。此類別中有數萬(甚至更多!)個 SKU。我們會盡可能地進行測試,有時候我們會從拍賣網站取得較舊的設備,以方便我們測試和修復在無法複製問題時通報的設備問題。如果您發現特定設備的問題,請在 GitHub 上提交問題。

最後,一些平台,例如 iOS 7,已被棄用。也許它們可以正常工作,但我們不會在已被棄用的平台上進行測試,也不提供任何保證。但是,如果我們可以在修補程式生效後測試時充分支援這些平台,我們會根據具體情況考慮針對已被棄用的平台的修補程式。

Flutter 會維護一個 網頁,列出我們會在其中進行測試的設備以及我們會尋求社群幫助的設備。

決定停止支援

儘管我們致力於在尽可能長的時間內支援每個平台版本,但支援舊平台(或平台組態,例如 Apple A7 上的 OpenGL)需要付出代價,並且會遵循我們上游合作夥伴(包括 Skia)的指南。Flutter 的核心工程團隊規模相對較小,我們會不斷做出權衡,以確保我們所做的事情對使用者來說最有利。在某些時候,工程方面、CI 實驗室中測試的頻寬以及隨機測試的頻寬,以及技術限制(例如作業系統供應商停止支援平台版本中的工具)的成本可能會讓繼續支援目標平台變得困難或不可能。

在我們決定停止支援之前,我們會考慮以下一些問題:

  • 這將會減少我們開發人員的多少終端使用者?
  • 這對 Flutter 開發人員有何影響?是否有主要合作夥伴的業務運營會受到重大影響?
  • 我們可能會節省多少工程成本?例如,透過支援多個作業系統版本,使用 Flutter 建立的應用程式數量是否會增加?(例如,在 iOS 版本中支援 OpenGL 和 Metal 就是這樣的案例。)
  • 這個決定是否符合我們廣泛採用和包容性的目標?
  • 停止支援是否是由外部原因引起的,例如平台供應商在其建置工具中停止支援平台版本?如果是,是否有可能減輕這種停止支援的影響?

在評估是否停止支援時,我們會先透過在 GitHub 中開啟一個議題來詢問您的意見,並發布一份相關的 Flutter 設計文件,該文件會提出停止支援的建議,說明我們為何考慮停止支援,以及可能可用的緩解措施。這是一個向社群徵求意見的請求 (RFC);公共設計文件會透過我們的討論清單 ([email protected]) 和我們的 Discord 推廣。

若要開始停止支援,我們會在發佈穩定版本時,作為穩定版本公告的一部分,啟動 RFC 流程。然後,我們會留出時間供公眾發表意見,然後在後續平台版本中減少對平台或功能的支援。RFC 是您提供回饋的機會。根據我們收到的回饋,我們將繼續停止支援,或對提議進行修改,將平台版本的支援時間延長。我們會認真对待這些前瞻性決定的回饋意见,因為我們認識到我們對您和您的產品使用者負有責任。

徵求意見:停止支援 iOS 8

我們正在考慮停止支援 iOS 8。所有 iOS 8 設備都可以升級到 iOS 9。根據 Google 和第三方分析,運行 iOS 8 的設備數量非常少(一些報告顯示「0.0%」),而 Apple 正在逐步停止支援其工具中的 iOS 8。

我們已發布了 有關停止支援 iOS 8 的徵求意見請求,我們請求您審閱並參與討論。我們的目的是使 Flutter 1.22(我們最新的穩定版本)成為最後一個支援 iOS 8 的穩定版本。RFC 包含理由以及如果您受到影響,該如何操作。

徵求意見:停止支援 Android Jelly Bean

我們正在考慮停止支援 Android Jelly Bean,因為我們不再在實驗室中測試運行該版本的 Android 設備,而為實驗室取得可靠的設備也越來越困難。目前運行 Android Jelly Bean 的設備約佔 Android 使用者群體的 0.46%。

我們已發布了 有關停止支援 Android Jelly Bean 的徵求意見請求,我們請求您審閱並參與討論。我們的目的是使 Flutter 1.22(我們最新的穩定版本)成為最後一個支援 Android Jelly Bean 的穩定版本。RFC 包含理由以及如果您受到影響,該如何操作。

您可以如何幫助

最簡單的幫助方式是參與!我們感謝您提交有關我們尚未遇到的各種設備的邊緣案例的問題。在許多情況下,這些問題出現在我們從未擁有的硬體上,即使我們將硬體測試的支出增加一倍或四倍。報告這些問題,並提供可重現的情況和有關軟體版本和硬體型號的詳細資訊,對我們追蹤問題的根源至關重要。

此外,我們希望您在需要減少對特定平台的支援時,參與決策過程。當我們考慮 Flutter 的未來時,您的見解非常寶貴。請在您看到 RFC 時參與我們公開的 RFC。您是您特定市場的專家,也是離您的客戶最近的人。

我們非常感謝您對我們使用者和讓我們成為您產品一部分的信任。我們仍然致力於幫助您將您的願景呈現在尽可能多的螢幕上。


大規模提供作業系統相容性 最初發佈在 Flutter 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

\n