面試官: 你有用過Flutter嗎? Flutter架構是怎麼樣,爲何會比其餘如ReactNative好
心理分析: 面試官所在的項目是用Flutter 開發的,或者正在轉Flutter這種技術。若是你不會,面試官在第一眼會認爲後面來應聘的人或許會、爲了杜絕這種狀況發生,你必定要說之前研究過,寫過相關代碼。其實」有用過Flutter「對大多數求職只是 會與不會 的問題。這不是面試官 想了解的。面試官的重點 你瞭解的有多深。
接下來,會問你他的原理 你是怎麼看。 它的優缺點。爲何比其餘的好。從原理層來解析。這纔是最難的。
這篇文章 從原理層說明他們的區別
求職者: 應該作好被虐的準備。若是看了這篇文章,應付下來基本沒有多大的問題
在Flutter誕生以前,已經有許多跨平臺UI框架的方案,好比基於WebView的Cordova、AppCan等,還有使用HTML+JavaScript渲染成原生控件的React Native、Weex等。
更多面試內容,面試專題,flutter視頻 全套,音視頻從0到高手開發。
關注GitHub:https://github.com/xiangjiana/Android-MS
免費獲取面試PDF合集
VX:mm14525201314git
首先看一下Flutter的架構圖
github
Framework
Engine
Embedder
1.Framework使用dart實現,包括Material Design風格的Widget,Cupertino(針對iOS)風格的Widgets,文本/圖片/按鈕等基礎Widgets,渲染,動畫,手勢等。此部分的核心代碼是:flutter倉庫下的flutter package,以及sky_engine倉庫下的io,async,ui(dart:ui庫提供了Flutter框架和引擎之間的接口)等package。
web
2.Engine使用C++實現,主要包括:Skia,Dart和Text。Skia是開源的二維圖形庫,提供了適用於多種軟硬件平臺的通用API面試
3.Embedder是一個嵌入層,即把Flutter嵌入到各個平臺上去,這裏作的主要工做包括渲染Surface設置,線程設置,以及插件等。從這裏能夠看出,Flutter的平臺相關層很低,平臺(如iOS)只是提供一個畫布,剩餘的全部渲染相關的邏輯都在Flutter內部,這就使得它具備了很好的跨端一致性。編程
從架構圖能夠看出,從頭至尾重寫一套跨平臺的UI框架,包括UI控件、渲染邏輯甚至開發語言。渲染引擎依靠跨平臺的Skia圖形庫來實現,依賴系統的只有圖形繪製相關的接口,能夠在最大程度上保證不一樣平臺、不一樣設備的體驗一致性,邏輯處理使用支持AOT的Dart語言,執行效率也比JavaScript高得多瀏覽器
目前上主流的思想,都但願將各個ui控件接耦,慢慢演變出組件化的思想。
Flutter控件主要分爲兩大類,安全
StatelessWidget
用來展現靜態的文本或者圖片,若是控件須要根據外部數據或者用戶操做來改變的話,就須要使用StatefulWidget
。數據結構
State的概念也是來源於Facebook的流行Web框架React,React風格的框架中使用控件樹和各自的狀態來構建界面,當某個控件的狀態發生變化時由框架負責對比先後狀態差別而且採起最小代價來更新渲染結果。架構
從下圖這裏能夠看出 Flutter和 React-Native之衆的本質區別:React-Native之類只是擴展調用 OEM組件,而 Flutter是本身渲染。框架
在 Flutter Architecture的解釋中,Google還提供了一張更爲詳盡的圖來解釋 Flutter的原理:
這張圖解釋得更清晰一些:Flutter只關心向 GPU提供視圖數據,GPU的 VSync信號同步到 UI線程,UI線程使用 Dart來構建抽象的視圖結構,這份數據結構在 GPU線程進行圖層合成,視圖數據提供給 Skia引擎渲染爲 GPU數據,這些數據經過 OpenGL或者 Vulkan提供給 GPU。
因此 Flutter並不關心顯示器、視頻控制器以及 GPU具體工做,它只關心 GPU發出的 VSync信號,儘量快地在兩個 VSync信號之間計算併合成視圖數據,而且把數據提供給 GPU。
瞭解 Flutter的基本概念後,天然有幾個疑問亟待解決。
前面提到了 Flutter只關心如何構建視圖抽象結構,向 GPU提供視圖數據。Skia就是 Flutter向 GPU提供數據的途徑。
咱們可能只知道 Flutter作了什麼,始終都尚未從側面觀察 Flutter的整個架構設計,瞭解 Flutter如何去作。
這張圖瞭解過 Flutter的人可能不少地方都看過,這邊來詳細解釋一下:
Flutter Framework: 這是一個純 Dart實現的 SDK,相似於 React在 JavaScript中的做用。它實現了一套基礎庫, 用於處理動畫、繪圖和手勢。而且基於繪圖封裝了一套 UI組件庫,而後根據 Material 和Cupertino兩種視覺風格區分開來。這個純 Dart實現的 SDK被封裝爲了一個叫做 dart:ui的 Dart庫。咱們在使用 Flutter寫 App的時候,直接導入這個庫便可使用組件等功能。
Flutter Engine: 這是一個純 C++實現的 SDK,其中囊括了 Skia引擎、Dart運行時、文字排版引擎等。不過說白了,它就是 Dart的一個運行時,它能夠以 JIT、JIT Snapshot 或者 AOT的模式運行 Dart代碼。在代碼調用 dart:ui庫時,提供 dart:ui庫中 Native Binding 實現。 不過別忘了,這個運行時還控制着 VSync信號的傳遞、GPU數據的填充等,而且還負責把客戶端的事件傳遞到運行時中的代碼。
在瞭解屏幕繪圖的基本原理和 Flutter的一個總體概念後,咱們下面詳細地來看一下 Flutter的大概實現。
要理解 Flutter的原理,咱們從 entry point開始看 Flutter的代碼。因爲應用框架大同小異,因此下文說起 Flutter的代碼即指代 Flutter Engine的代碼,而非 Flutter Dart Framework代碼。
下圖是我簡單整理了一下 Flutter應用啓動後的執行順序
能夠的。
更多面試內容,面試專題,flutter視頻 全套,音視頻從0到高手開發。
關注GitHub:https://github.com/xiangjiana/Android-MS
免費獲取面試PDF合集