--- title: '認識 Flutter 跨平台技術、建立 Flutter 專案' disqus: kyleAlien --- 認識 Flutter 跨平台技術、建立 Flutter 專案 === ## Overview of Content :::success * 如果喜歡讀更好看一點的網頁版本,可以到我新做的網站 [**DevTech Ascendancy Hub**](https://devtechascendancy.com/) 本篇文章對應的是 [**探索跨平台與 Flutter 技術的未來:從認識到 Flutter 專案建置 | 3 種跨平台**](https://devtechascendancy.com/explore-cross-platform-flutter-tech/) ::: [TOC] ## 認識跨平台技術 跨平台開發,可以節省人力成本,不需要區分 `iOS`、`Android`、`Web`、`桌面應用`… 等等多個技術,以及多個開發團隊,對於許多公司來說都是相當重要的技術,而這個技術的選擇就是我們接下來要做的比較、認識(我們會以 Moblie 端開發來比較) > 以 moblie 開發端(移動開發)來說,使用同一套代碼就可以開發出 `android` apk、`iOS` ipa 應用 ### 手機移動端跨平台技術:H5、Reaction Native 1. 原生開發 - **Native 開發**:Native 開發就是指使用各自平台自身的技術來開發,有幾個平台就會有幾種開發專案(這種方式尚未跨及跨平台開發) * **開發成本較高**: 原生開發要維護 Android、ios 兩個開發團隊、經過版本更新後,其成本會不斷上升 (開發、測試、維護...) * **動態化需求**: 原生 Native 開應用大多數需要透過版本升級來更新內容,鮮少可以不更新應用就可以加載新功能、修復錯誤(除了熱修復技術) :::info * **Native 熱修復技術** 熱修復技術就是講求使用者不用更新新版應用也可以加載新功能、修復錯誤,但這並不是本章的重點… 先暫時知道概念即可 ::: 2. H5 - **PhoneGap、Cordova、WebView 技術**: * 最早在 2008 年有出現 [**PhoneGap**](https://phonegap.com/blog/tag/android/) 的框架 (支持 `Android` 平台),之後貢獻給 Apache 的開源項目轉為 [**Cordova**](https://cordova.apache.org/docs/zh-cn/latest/guide/platforms/android/) (其核心同樣是 `PhoneGap`) * 採用 `HTML`、`CSS`、`JS` 來完成跨平台技術,**其工作原理類似於 WebView,利用 `JavaInterface` 來完成與 Native 的互交** * 好處就是,H5 支援熱重載技術,因為 Web 技術本就是在運行期間(`Runtime`)加載的技術 :::warning 雖然補齊了 Native 應用熱加載的不足,但相對來說 H5 開發的手機應用性能就比純 Native 應用還差,而且 H5 的 UI 設計就與原生應用有很大的不同 ::: * WebView 擔任 JavaScript 語言與 Native 語言之間的通信橋梁,但 **WebView 性能堪憂而且有「原生內存洩漏問題」** > 用於 JS 與 Native 通訊的工具稱為 WebView JsBridge > >  3. 跨平台框架 - **Reaction Native 技術** * Reaction Native 技術(簡稱 `RN`)是由 facebook 在 2015 開發出來的開源框架;React Native 允許開發者使用 JavaScript 和 React 來構建 Android 和 iOS 平台的應用程式,並且能夠共享大部分的代碼,從而提高開發效率和縮短開發時間 * 而 RN 的繪製概念是通過「**橋梁**」完成「**原生繪製**」,**也就是說將==渲染的工作交給 Native==** 而不是 JS(這樣可以達到畫面渲染更優的效能) > 並且 RN 一樣可以保持熱加載的特性 :::success * 複習 Android Native 繪製方式(舊版命令式 UI,並非 Compose UI) 1. 原生庫的 xml 就是配置文件 2. 經過 inflater 分析 3. 反射創建 view ::: * 使用 RN 的話,要使用 JS 寫好移動端的 UI,通過 Bridge 將 `Virtual Dom` (VD) 讀取並創建,當 UI 更新仍要透過 Bridge 傳遞並再次創建,導致 Bridge 維護成本較高 >  ### 解釋語言 vs. 編譯語言 * 對於上述的跨平台開發來講,都屬於使用解釋型語言(也就是 JS),而下表會簡單說明解釋語言、編譯語言兩種的特性 | 類型 | 語言 | 特色 | | -------- | -------- | -------- | | 解釋型 | JS | 效率較低、通用度高 | | 編譯型 | C、C++ | 效率高、速度快 | | 混和型 | Java | Java 源於解釋型語言,但又多了 `MetaData` 運行時解釋,造就了它是混合型語言的特性 | * JS 就是解釋型語言,看到哪解釋到哪,**並非一次性解析**,而 C/C++ 則是編譯型語言,一次性編譯成為了專屬機台的機械碼 * Java 則是混和型語言,**早期透過 JVM 解釋字節碼(.class 文件),到後期開發出 `JIN`、`AOT` 就轉型成為了編譯型語言** ## 認識 Flutter 技術 經由 2015 年的 Sky 前身,在 2018 年 Google 發表的 Flutter 移動 UI 框架技術 (免費、開源),可以快速在 `iOS`、`android` 上架構高質量的 **原生用戶介面** 並且可以與原有的程式共同運行 :::success * **`Flutter` & `React Native` 差異** RN 其主要是透過 Bridge 的構通,分析過後產生相對的本地 View,這最終會導致 Bridge 的負載較大 Flutter 則是透過另外一個平台,**++經過編譯過後產生符合另一個平台的原生代碼++**,類似於所謂的 **交叉編譯**,來達到比起 RN 更高的效能(但又符合編寫一次代碼就可運行在多個平台) ::: ### Flutter 優勢、特點 * 其主要有幾個優勢,^1.^ **跨平台 UI 框架、編譯語言** ^2.^ **與原生 Native 互交**、^3.^ **開源** 1. ==**跨平台**==:移動端系統目前有 Android、IOS 兩個大平台,而 **Flutter 除了支援這兩個 UI 以外還支持了 Fuchsia 系統** :::info * [**Fuchsia**](https://zh.wikipedia.org/wiki/Google_Fuchsia) 是 Google 開發的新移動端系統,主要是以 C、C++ 開發,但是仍在開發階段並未完全成行,可繼續關注 * 其 UI 特點也有三個,Hot Reload、優質介面、本地性能,Debug 使用 JIN,Release 使用 AOT * Hot Reload:不需要重新編譯安裝就可以直接使用、測試 * UI:對於 UI 設計的風格統一 * 性能:其性能接近於原生 ::: 2. ==**Native 互交**==: 可在原有的應用中嵌入 Flutter 進行開發 3. ==**開源**==: 免費~ 不必擔心版權問題 :::warning * React Native 被棄用的原因在之後 [**修改的協議**](https://www.zhihu.com/question/65437198/answer/231564052),若是使用可能會影響到使用者的版權,而 Flutter 則沒有這方面的問題 ::: ### Flutter 概念、架構 * 以下是 Flutter 的概念圖,經由「**交叉編譯**」根據不同平台編譯出對應的機械碼,因此省去了 Bridge 的開銷,而 **==這個編譯系統則是 Dart VM==,Flutter 可以透過 Dart VM 程式會編譯成對應的 ++ARM 機械碼++** >  * 架構圖如下 (來源網路),Skia 渲染引擎、Dart VM >  ### 跨平台技術分析、比較 | 跨平台技術 | 優點 | 缺點 | | -------- | -------- | -------- | | webView | android 原生支持 webView,JS & Java 互交 | android WebView 原生問題 (內存洩漏,最終導致 OOM)、Js 加載速度慢 | | React Native(RN) | RN 渲染機制 (本地繪製) | Bridge 附載過重、維護成本高 | | Flutter | 編譯成本地代碼,效率較高,HotReload、App 風格統一(fps120)、接近本地速度 | Native 還是較快一些、並且會增加 APK 的大小 | ### Flutter 安裝、建立 Flutter 專案 * 到 [**Flutter 網站**](https://flutterchina.club/get-started/install/)下載 Flutter SDK 包,下載後解壓縮,**並將該 bin 目錄加入到環境變數** :::info * 安裝之後可以到指令目錄下,**`flutter doctor`** 指令,它會檢查當前設備的環境是否還有缺使 flutter 插件 >  ::: 1. Android Studio 中點擊 File Settings,搜尋 Plugins 並點擊,**在內部搜尋欄位搜尋 Flutter 並安裝** (之後會要求重啟 AS IDE) >  2. 接著搜尋 Dart,自動補齊代碼 >  3. 安裝完畢後就會有新的選項,`File` -> `New` -> `New Flutter Project`(新) >  4. 選擇 Flutter SDK 的路徑後就可以創建 Flutter 專案 >  ## Appendix & FAQ :::info ::: ###### tags: `Flutter`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up