iOS原生 VS Flutter評測

ZacJi發表於2018-05-30

iOS原生 VS Flutter評測
本人之前分別嘗試用iOS原生和Flutter寫了同一個小應用, 一個空氣質量查詢App, 名字叫Aireport, 目前已經分別上架了App Store.

Aireport(iOS原生)

Aireport Flutter(Flutter版)

Aireport原本是我自己在用, 但是在初步學習了Flutter後我決定用Flutter最大限度的去模仿iOS原生版的應用, 以評估Flutter是否有能力做到以假亂真的地步. 我們在上一篇文章中已經探討了Flutter在開發中可能遇到的問題, 這篇文章我們將著重放在兩者使用者在實際體驗中的差距.

1.安裝包大小

安裝包大小決定了使用者等待下載的時間和可能會耗費的流量, 即便是即將邁入5G時代的今天, 我們依然需要儘量優化應用安裝的大小.

Flutter應用安裝包和安裝後容量

iOS原生 VS Flutter評測
iOS原生應用安裝包和安裝後容量
iOS原生 VS Flutter評測
雖然Flutter的結果我多少能夠猜到, 但安裝包9倍, 磁碟佔用4倍的差距還是讓我感到失望, 何況如果我使用OC開發的話安裝包還能進一步縮小(WWDC有可能將swift設為穩定版嵌入iOS系統核心, 屆時swift版將有望自動瘦身).

iOS原生 VS Flutter評測
由於專案很小就百行程式碼, 因此這30MB的空間佔用基本就是Flutter的SDK容量.30MB的空間對於一款App來說已經是一個不小的數字, 而且應用之間不能共享SDK, 有幾個Flutter應用就會有幾個Flutter SDK. 這讓技術團隊在選擇開發框架時不得不著重考慮一下今後App的容量問題.

2.啟動速度

上面的應用容量除了影響磁碟佔用外, 對啟動速度也會有影響. 我在iPhone X上實測了一下, iOS原生應用的冷啟動速度大概是在0.4秒左右, 而Flutter的冷啟動速度在1.5秒左右.

iOS原生 VS Flutter評測
毫無意外iOS這一局又佔上風. Flutter的啟動過程首先會去跑完完整的iOS原生應用的所有流程直至第一個ViewController例項化後,再由VC去呼叫載入Flutter SDK, 初始化Flutter的執行時環境. 也就是說Flutter應用的啟動時間=iOS原生應用的啟動時間+Flutter環境的啟動時間. 使用者對於應用的容量佔用幾乎很難察覺, 但是應用的啟動時間對使用者體驗的影響絕對是致命的(雖然現在的啟屏廣告已經完全不考慮使用者體驗了). 在這一點上不知道往後Google團隊還有沒有優化的空間.

3.記憶體佔用

記憶體佔用一直是移動開發中的一個優化重點.不過目前來看Release版的Flutter在記憶體佔用這一塊也沒有任何優勢, SDK拖累是一方面, 單個頁面記憶體佔用也比原生多一倍.

iOS原生 VS Flutter評測
注意, 我們知道Flutter在Build版本中的效能和Release是不一樣的, 同一個應用, Build版的記憶體佔用在100M左右, 為了熱載入我也是忍了.

記憶體佔用不僅影響著應用效能、電池損耗、 程式穩定性, 最重要但是, 記憶體佔用越大, 被系統幹掉後臺的可能性就越大. 我自己的使用體驗來看, iOS原生的Aireport基本上大部分時間都處於休眠狀態, 而Flutter會在關閉不久後直接被系統幹掉.

4.流暢度

從框架一出現,60FPS似乎始終貫穿於各大Flutter的介紹和分析文章中, 這讓我們對Flutter的流暢度非常期待.然而:

iOS原生 VS Flutter評測
iOS原生 VS Flutter評測
上面是iOS原生App的幀率, 下面是Flutter的幀率, 很明顯這是一個尷尬的結果.Flutter應用在執行過程中頻繁出現了紅色的警告, 這表明應用在這段時間沒沒有以60幀的速度完美渲染出頁面.

這種幀率的差距也體現在了實際使用中. 無論是頁面的切換, 還是ListView的滾動, Flutter都僅僅能達到還算流暢的程度, 但明顯還達不到iOS原生60幀的絲般順滑. 當然, 目前的Flutter還處在Beta版, 而且我個人認為, 相對於安裝包大小和啟動速度, 執行時的流暢度更容易進行優化. 我相信Flutter將在之後的版本中進一步優化應用的流暢度, 達到與原生媲美的程度.

5.iOS特性支援

iOS應用開發受益於強大的iOS系統和豐富的生態體系, 天生就具有大量實用且不可替代的特性, 例如Bitcode能夠在雲端自動優化我們App的程式碼, 原生應用預設就支援增量更新、後臺應用重新整理等等.

iOS原生 VS Flutter評測
很顯然Apple賦予iOS應用的這些種種特性與Flutter應用是無緣的, 如果Flutter能夠支援熱更新的化那麼其可用價值就高了許多. 但目前實現起來還有諸多問題, 包括部署、效能問題, 以及蘋果對於熱更新的謹慎態度.

綜合了目前Flutter在開發中的體驗以及和原生應用的比較, 我目前對Flutter的評估結果是: 再等等.

Flutter的確提供了一種不同於目前其他跨平臺開發框架的思路, 也極有可能成為未來跨平臺開發的標杆. 如果你是個人開發, 我還是建議你學習一下Flutter, 它的Dart語言、Wiget化、資料繫結、單向資料流等等現代特性值得你去了解. 同時對於無法同時掌握多個移動開發平臺的小夥伴而言, 使用Flutter也是一種成本較為低廉的方法. 但是對於公司而言, Flutter還無法完全投入生產環境, 而且初期Flutter的開發成本未必會低於原生平臺.

目前Fuchsia的開發進度還不得而知, Flutter也還處在Beta3階段. 相信等Fuchsia正式釋出的時候才是檢驗Flutter正在實力的時候.

相關文章