「Flutter實戰」移動技術發展史

老孟導讀:大家好,這是【Flutter實戰】系列文章的第一篇,這並不是一篇Flutter技術文章,而是介紹智能手機操作系統、跨平臺技術的演進以及我對各種跨平臺技術看法的文章。

智能手機操作系統

塞班(Symbian)系統

後浪們可能都沒有聽說過塞班系統,而很多前浪們也會詫異,塞班是智能手機操作系統嗎?讓我們先來看下智能手機的定義:

智能手機,是指像個人電腦一樣,具有獨立的操作系統,獨立的運行空間,可以由用戶自行安裝軟件、遊戲、導航等第三方服務商提供的程序,並可以通過移動通訊網絡來實現無線網絡接入的手機類型的總稱。目前智能手機的發展趨勢是充分加入了人工智能、5G等多項專利技術,使智能手機成為了用途最為廣泛的專利產品。

所以按照如上的定義,塞班系統屬於智能手機操作系統,那為什麼很多人都認為塞班系統不屬於智能手機操作系統呢?主要是因為塞班和現在的Android、iOS智能系統比起來差遠了。

雖然現在塞班系統已經Game Over了,但當年塞班系統是當之無愧的王者,根本就沒有一個與之匹配的對手。

2008年12月2日,塞班公司被諾基亞收購。

2011年12月21日,諾基亞官方宣佈放棄塞班品牌。由於缺乏新技術支持,塞班的市場份額日益萎縮。

截止至2012年2月,塞班系統的全球市場佔有量僅為3%。

2012年5月27日,諾基亞徹底放棄開發塞班系統,但是服務將一直持續到2016年。

2013年1月24日晚間,諾基亞宣佈,今後將不再發布塞班系統的手機,意味著塞班這個智能手機操作系統,在長達14年的歷史之後,終於迎來了謝幕。

至此,塞班時代終結,一個時代的終結,必將伴隨著新時代的到來。

Windows Phone

Windows Phone(簡稱為WP)是微軟於2010年10月21日正式發佈的一款手機操作系統,初始版本命名為Windows Phone7.0。

2011年9月27日,微軟發佈升級版Windows Phone 7.5,這是首個支持簡體中文的系統版本。2012年6月21日,微軟正式發佈Windows Phone 8,全新的Windows Phone 8捨棄了老舊Windows CE內核,採用了與Windows系統相同的Windows NT內核,支持很多新的特性。由於內核的改變,所有Windows Phone 7.5系統的手機都將無法升級至Windows Phone 8。2015年1月22日,微軟將Windows Phone 10更名為Windows 10 for Phone。2015年5月14日,微軟官網正式將智能手機上的版本命名為“Windows 10 Mobile” 。2019年12月10日,微軟停止對Windows 10 Mobile的支持。

2019年12月10日這一天,微軟宣佈停止對Windows 10 Mobile的支持,也就宣告Windows 10 Mobile告別了歷史的舞臺。

Windows Phone當年的市場份額一度超過50%,到退出歷史的舞臺,在我看來微軟犯了一個很大的錯誤:

那就是Windows Phone 8的發佈,由於使用了新的內核導致以前的手機無法升級而且軟件不向下兼容,導致用戶和開發者極度不爽,用戶剛買了手機,結果你告訴用戶系統不能升級?

新系統導致以前開發的App無法運行,開發者重新開發一遍?而且還要維護兩套?

系統最核心的資產是生態,當你拋棄了開發者也就意味著生態的殘缺,沒有大量優質的應用用戶怎麼可能買你的手機?

Android

Android系統大家都非常熟悉了,畢竟是當前市場份額最大的移動操作系統,看一下Android的發展歷程:

2003年10月,Andy Rubin等人創建Android公司,並組建Android團隊。2005年8月17日,Google低調收購了成立僅22個月的高科技企業Android及其團隊。安迪魯賓成為Google公司工程部副總裁,繼續負責Android項目。2008年,在GoogleI/O大會上,谷歌提出了AndroidHAL架構圖,在同年8月18號,Android獲得了美國聯邦通信委員會(FCC)的批准,在2008年9月,谷歌正式發佈了Android 1.0系統,這也是Android系統最早的版本。2009年4月,谷歌正式推出了Android 1.5這款手機,從Android 1.5版本開始,谷歌開始將Android的版本以甜品的名字命名,Android 1.5命名為Cupcake。2010年10月,谷歌宣佈Android系統達到了第一個里程碑,即電子市場上獲得官方數字認證的Android應用數量已經達到了10萬個,Android系統的應用增長非常迅速。2011年8月2日,Android手機已佔據全球智能機市場48%的份額,並在亞太地區市場佔據統治地位,終結了塞班系統的霸主地位,躍居全球第一。今年(2020年)即將發佈Android 11。

iOS

iOS是由蘋果公司開發的移動操作系統 。蘋果公司最早於2007年1月9日的Macworld大會上公佈這個系統,其發展歷程如下:

2007年10月17日,蘋果公司發佈了第一個本地化iPhone應用程序開發包(SDK),並且計劃在2月發送到每個開發者以及開發商手中。2010年6月,蘋果公司將“iPhone OS”改名為“iOS”,同時還獲得了思科iOS的名稱授權。2010年第四季度,蘋果公司的iOS佔據了全球智能手機操作系統26%的市場份額。2013年6月10日,蘋果公司在WWDC 2013上發佈了iOS 7,幾乎重繪了所有的系統App,去掉了所有的仿實物化,整體設計風格轉為扁平化設計。將於2013年秋正式開放下載更新。2016年9月14日,蘋果發佈iOS 10正式版,這是蘋果推出移動操作系統以來最大的一次更新,尤其增加了很多特別適應中國國情的功能,比如騷擾電話識別、蘋果地圖進一步本地化等。2018年9月13日,2018蘋果秋季新品發佈會上,蘋果CEO庫克介紹了蘋果生態的一些數據。他表示,搭載蘋果iOS系統設備已達20億部。2020年5月21日,蘋果發佈iOS 13.5正式版,iOS 13.5加快了配備面容ID的設備在用戶佩戴口罩時顯示密碼欄的速度,並加入了“暴露通知”API以支持來自公共衛生管理機構的COVID-19接觸追蹤App。

跨平臺開發演進

2008年7月IPhone推出第一代手機IPhone 3G,同年9月谷歌正式發佈了Android 1.0系統,標誌著我們正式步入移動端發展期,按照技術開發的歷程移動端(目前特指Android和iOS)的發展大致可以分為4個階段:原生階段->Hybird階段->RN階段->Flutter 階段。

原生階段

使用原生語言(Android使用Java或Kotlin,iOS使用Objective-C 或 Swift )開發應用,稱之為原生階段

在此階段發現一樣的功能需要在Android和iOS兩端開發,開發和維護成本較高,同時無動態化更新能力,緊急問題的修復和添加新功能都需要到相應平臺發版,尤其是iOS審核的週期非常長,在國內Android雖然有動態化方案,但如果上架Google Play很有可能審核不通過或者下架,iOS也有動態化,但蘋果官方基本審核不通過,所以原生的動態化更新受政策影響很大。

從開發者的角度出發,是否有一種方案可以開發一套代碼在多個平臺運行且可以動態化更新,無需在走平臺的審核。基於這個需求H5興起,也就是我們所說的Hybird階段。

Hybird階段

Hybird實現的基本原理是通過原生的WebView容器加載H5網頁進行渲染,通過JavaScript Bridge調用一部分系統能力,同步更新服務器上的H5網頁也實現了動態更新,俗稱混合應用。

當時大量的公司使用此方案進行開發,最出名的就是Facebook,早期的Facebook在H5上投入了大量的精力,一次開發、快速迭代這是使用H5技術巨大的優勢。

然而一切看似美好,但很快發現,H5方案存在致命的缺陷-用戶體驗極差

Facebook創始人兼CEO馬克·扎克伯格在接受採訪的時候承認:專注在HTML 5上面是他有史以來犯過的最大的錯誤。

然而福兮禍所伏,雖然在Facebook上大量使用H5而導致用戶體驗極差,但Facebook基於強大的H5技術積累開發出了偉大的React框架,此框架是React Native框架的基礎。

React Native階段

React Native簡稱RN,是FaceBook在2015年開源,基於 JavaScript,具備動態配置能力跨平臺開發框架。React Native框架原理如下:

React Native 使用React開發,然後生成虛擬DOM樹,虛擬 DOM 是一個 JavaScript 的樹形結構,通過虛擬DOM樹映射到不同平臺的本地控件,最終顯示的UI是原生控件,因此在性能體驗上和原生非常相近。和React Native 類似的框架還有阿里巴巴的Weex框架,Weex是在React Native基礎上重新設計了一套開發模式,原理上和React Native 一樣。

React Native 解決了繼承了H5的優點,同時解決了性能體驗上的問題,2015年React Native一經發布,就在技術圈引起了巨大的反響,在當時看來React Native 是一個非常完美的跨平臺解決方案,很快大量開發者湧入。

當年使用React Native 的開發者最擔心的不是React Native 性能如何?體驗如何?而是擔心蘋果會不會封掉React Native,可想而知React Native 的火爆程度,當年著名的JSPatch事件起初,起初大家都在說蘋果開始對React Native下手了,雖然後來證實和React Native無關,但多多少少都對React Native 開發者造成了一定的影響。

隨著時間的流逝,發現React Native 和原生橋接的成本非常高,在複雜場景下會出現嚴重的性能問題,比如早期的ListView滑動卡頓問題。

React Native要橋接到原生控件,但Android和IOS控件的差異導致React Native無法統一API,有的屬性IOS支持,Android不支持,有的Android支持,IOS不支持,這就導致經常需要開發Android和IOS兩套插件,隨著項目的複雜度提升,也導致維護成本大幅提升。

還有一個很大的問題就是React Native 依賴於 Facebook 的維護,而每次iOS和Android系統版本更新,很大程度上會受到影響。

小程序

從技術上來說,小程序(指微信小程序,下同)並不是新的跨平臺方案,它使用瀏覽器內核來渲染界面,小部分由原生組件渲染,原理圖如下:

小程序的運行環境分成渲染層和邏輯層,通信會經由微信客戶端(Native)做中轉。

微信小程序目前來看是非常成功的,在我看來微信小程序成功主要原因並不是因為技術,而是生態,當然微信小程序體驗也是非常好的。

對商家來說,微信小程序擁有月活10億的微信用戶,獲客成本低,這是一個流量極佳的平臺,因此很多商家開發了體驗極好的小程序,甚至一些商家把主要平臺遷移到了微信小程序。

對於用戶來說,無需下載,用完就走,極大的提升了用戶體驗,微信提供基礎服務平臺,商家獲客成本低,用戶體驗提升,三方形成完美的平衡,因此微信小程序的生態越來越完善。

除了小程序外,類似的方案還有百度的輕應用和快應用,但都不溫不火。

Flutter 階段

千呼萬喚始出來,主角-Flutter終於登場了,Flutter是谷歌的移動UI框架,可以快速在iOS和Android上構建高質量的原生用戶界面。

Flutter吸收了前面的經驗,它既沒有使用WebView,也沒有使用原生控件進行繪製,而是自己實現了一套高性能渲染引擎來繪製UI,這個引擎就是大名鼎鼎的Skia,Skia是一個2D繪圖引擎庫,Chrome和Android都是採用Skia作為引擎。Flutter完美的解決了跨平臺代碼複用和性能問題,大家都在感嘆:似乎UI迎來了終極解決方案。

Flutter侷限性

Flutter並不是無所不能的,當你選取Flutter作為技術方案時,首先要了解Flutter無法實現哪些功能。

UI平臺一致性

由於Flutter使用自己的引擎進行UI渲染,而不是用原生控件渲染,導致控件顯示效果和原生不是完全一樣,雖然肉眼看起來基本一樣,但還是有一些細微的差別,尤其當Android和iOS系統升級導致原生控件效果發生變化時,Flutter開發的App並不會進行相應的變化,如果您的App需要原生控件保持完全一致,Flutter可能並不適合您。

動態化更新

動態化功能在國內來說是一項非常重要的功能,Google官方已經明確現階段不會實現動態化功能。

此功能並不是技術上無法實現,更多的還是政策和法律上的約束。

因此如果您的App需要動態化功能,那麼Flutter可能並不適合您。

總結

既然Flutter已經如此優秀了,那是不是以後使用Flutter就可以了呢?答案是否定的,未來很長一段時間應該是原生、Hybird、React Native、Flutter共存時代。

原生開發是無法完全避開的,一些硬件(比如藍牙、傳感器等)功能、音視頻和ARVR等相關功能必須使用原生開發,有人說我開發藍牙功能沒用寫原生代碼啊,直接引入即可,你沒有寫,那是因為有人為你封裝好了第三方插件。Hybird雖然有一些缺陷,但依然有其使用的場景,比如京東、天貓App中的營銷活動都是是H5實現的。React Native可以使用原生控件渲染,因此,如果您需要使用原生控件而又想跨平臺,React Native是不錯的選擇。

交流

老孟Flutter博客地址(330個控件用法):http://laomengit.com

歡迎加入Flutter交流群(微信:laomengit)、關注公眾號【老孟Flutter】