Flutter跨平臺初探
????Flutter一路了解下來冯丙,令人欣喜又贊嘆肉瓦。它可以跨越6個平臺,從桌面操作系統(tǒng)Windows胃惜、Linux、Mac OS船殉,到Web開發(fā)鲫趁,再到移動操作系統(tǒng)IOS、Android利虫“ず瘢跨越的廣度堡僻,前所未有。這讓人想起Java那句名言:"Write only once疫剃,Run anywhere"钉疫。在桌面操作系統(tǒng)上,Java基本實現(xiàn)了它的豪言壯語巢价。但自從sun被oracle收購后牲阁,并沒有再進一步。而Flutter似乎開啟了新的跨平臺紀元壤躲。雖然從目前來看城菊,各種生態(tài)還有待發(fā)展,性能也有待提高碉克,但前途星光燦爛凌唬,迸發(fā)著萬丈光芒。本文將重點從Android平臺的視角出發(fā)進行一些介紹棉胀。
(1)綜述
????Flutter使用Dart作為開發(fā)語言法瑟。Dart是一個現(xiàn)代的、靜態(tài)編譯的唁奢、面向?qū)ο蟮某绦蛟O(shè)計語言霎挟。語法風(fēng)格和Java非常的相似,比Kotlin更像Java多了麻掸。但這里對它不再過多介紹酥夭。
????Flutter其實是一個2D UI框架。在底層脊奋,它通過libflutter.so庫來繪制界面熬北。它并不使用Android 的View體系。Flutter的界面核心類是FlutterView诚隙,繼承自SurfaceView讶隐,通過native的方式進行UI繪制。Flutter只使用一個FlutterActivity久又,并管理著所有的路由(頁面)巫延。觸摸事件、手勢處理地消、消息傳遞炉峰,都由Flutter自己管理。它不使用xml這種構(gòu)建UI的方式脉执,而是通過Dart語言來描述Widget樹疼阔。它的國際化有很大的缺陷,官方目前推薦在代碼中用static final字符串來處理,可以說是一種非常糟糕的方式婆廊。也聽說有第三方dart庫可以解決這個問題迅细,但并未深入了解,這里就暫不多說否彩。
(2)主要目錄結(jié)構(gòu)
????Flutter Project可以通過flutter相關(guān)命令來創(chuàng)建疯攒,也可以通過AndroidStudio或者IDEA來創(chuàng)建。下面是它的主要目錄:
- android:一個android Project主目錄列荔;
- ios:一個ios Project主目錄敬尺,可以通過mac Xcode打開;
- linux:linux平臺目錄贴浙;
- macos:mac os平臺目錄砂吞;
- web:web平臺目錄;
- windows:windows平臺目錄崎溃;
- lib:跨平臺的精髓蜻直,UI繪制、跨平臺代碼等都在這里袁串。
????lib下是跨平臺的內(nèi)容概而,其他各個目錄是平臺相關(guān)的內(nèi)容。從lib這個名稱可以看出囱修,它是作為一個庫被各個平臺使用的赎瑰。
(3)Flutter 插件
????Flutter插件,是用來解決平臺相關(guān)問題的一種方案破镰。它是和平臺緊密相關(guān)的庫餐曼。在Android平臺,插件的代碼是由Java或者Kotlin編寫的鲜漩,最終會被打包進apk中源譬。IOS平臺也類似。某些和平臺相關(guān)的功能孕似,如果Flutter不能自己實現(xiàn)踩娘,也沒有可用的插件,那么需要自己分平臺實現(xiàn)喉祭。這會涉及到平臺與Flutter的通信养渴,它通過MethodChannel來支持。
(4)Flutter限制
????Flutter跨越這么多的平臺臂拓,有它的限制所在。以下是一些總結(jié):
????可以跨平臺的:
- 2D UI习寸,UI在主線程中更新的(通常都是胶惰,SurfaceView、TextureView例外) 霞溪;
- 網(wǎng)絡(luò)請求孵滞、簽名加密中捆、Json序列化;
- 圖片坊饶、文本資源的處理泄伪;
- 文件操作;
- 國際化匿级,雖然很糟糕蟋滴,但也算支持;
- 基本的動畫痘绎,如平移津函、旋轉(zhuǎn)、縮放孤页、Alpha等尔苦;
- 屏幕相關(guān)及資源適配;
????不能跨平臺的行施,這里包括需要平臺插件的允坚,或者需要和平臺相互通信處理的,如下:
- 跳轉(zhuǎn)到其他App蛾号,從其他App跳入稠项;
- Service、BroadcastReceiver须教、ContentProvider相關(guān)皿渗;
- 危險權(quán)限申請?zhí)幚恚?/li>
- WebView相關(guān);
- JNI相關(guān)轻腺;
- 與JS的交互相關(guān)乐疆;
- 多媒體相關(guān),如音樂播放贬养、視頻播放等挤土;
- 系統(tǒng)服務(wù)相關(guān),如震動误算、通知等仰美;
- 數(shù)據(jù)庫操作相關(guān);
- 需要在子線程中更新UI的儿礼,如SurfaceView咖杂、TextureView,使用場景如地圖展示等蚊夫;
- 3D相關(guān)诉字;
- 訪問SD卡非本App對應(yīng)目錄;
????如果有非常成熟的插件,其實也算可以跨平臺壤圃。畢竟陵霉,不需要自己在各自平臺加以實現(xiàn),只需添加依賴項即可伍绳。這上面所列不能跨平臺的踊挠,嚴格來說并不準確。但受時間精力所限冲杀,對各種插件了解不多效床,姑且這么列出來吧。如果沒有插件可以使用漠趁,那么就需要自己編寫可通信的平臺代碼扁凛。
(5)Flutter遺憾
????要統(tǒng)一這么多的平臺,自然并非易事闯传。尤其是這些平臺已經(jīng)發(fā)展了很多年谨朝,相當?shù)某墒欤鞣矫嬖谀撤N程度上都達到了極致甥绿。所以不可避免地字币,F(xiàn)lutter有一些遺憾,如下:
- 需要把Flutter各種庫共缕,如so庫洗出、插件庫、dart庫图谷,放入最終的包中翩活,使得App變得很大。一個僅僅展示HelloWorld的App便贵,安裝完后菠镇,要占據(jù)將近180M的空間;
- 任何一個使用Flutter開發(fā)的App承璃,上面所列舉的庫利耍,都被包含其中。如果安裝20個盔粹,那么最少可能有180 * 20 M的空間被消耗隘梨,很多庫都是重復(fù)的,并且重復(fù)20次舷嗡。如果有更多App轴猎,占據(jù)的空間更大,重復(fù)次數(shù)更多进萄。
- 性能問題捻脖。一個展示HelloWorld的App烦秩,冷啟動的時間,Android 真機大概7-8s(7年前的機器郎仆,android系統(tǒng)7.0),IOS真機(iphone Xs max兜蠕,最新系統(tǒng)16.0.2)大概5-6s扰肌。和原生App相比,差距實在太大了熊杨。這正是核心問題所在曙旭。而它又沒辦法避免,因為各種庫需要被加載晶府,尤其是flutter的so庫(30M+)桂躏。
????綜上,在一些性能要求不高的場景川陆,可以使用剂习;對于性能要求高的,目前沒法滿足较沪。
????Over 鳞绕!