老孟導讀:大家好,這是【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個控制元件用法):laomengit.com
歡迎加入Flutter交流群(微信:laomengit)、關注公眾號【老孟Flutter】: