Flutter創(chuàng)建髓绽、編譯到運行

創(chuàng)建一個Flutter工程

利用android studio創(chuàng)建

  1. Android Studio安裝Flutter插件
  2. New Flutter Project

利用flutter腳本創(chuàng)建

  1. 安裝flutter sdk 柜某,配置環(huán)境變量Path
  2. 創(chuàng)建目錄fluttertest棘捣,cd fluttertest
  3. 執(zhí)行flutter create . 創(chuàng)建flutter工程障般,工程下有android伴奥、ios、lib等目錄撒强,android/local.properties會自動把flutter sdk的路徑配置好
  4. 執(zhí)行flutter packages get --verbose 安裝依賴包
  5. 用Android Studio打開fluttertest工程即可編碼禽捆,運行

Flutter工程目錄說明

fluttertest
|
|---android
|   |---build.gradle
|   |---app
|       |---build.gradle
|   
|---ios
|
|---lib
|   
|---pubspec.yaml

lib: dart源碼目錄

android:andorid應用構(gòu)建目錄

ios:ios應用構(gòu)建目錄

pubspec.yaml:flutter項目采用pub管理依賴,pubspec.yaml是配置文件

Flutter Android編譯流程

  1. 在fluttertest目錄下執(zhí)行flutter run或者Android Studio點擊運行按鈕
  2. flutter run會調(diào)用到android目錄下的gradlew執(zhí)行g(shù)radle腳本來構(gòu)建android工程
  3. android/app/build.gradle 會依賴 $flutterRoot/packages/flutter_tools/gradle/flutter.gradle
  4. flutter.gradle腳本作用是添加android項目編譯的依賴庫jar和so飘哨,以及將flutter編譯任務插入android gradle編譯鏈中
  5. 執(zhí)行編譯鏈所有task將dart和android工程一同進行編譯成apk或aar產(chǎn)物

flutter.gradle主要工作

  1. addFlutterJarApiDependency增加flutter.jar的依賴

根據(jù)不同的buildType從sdk找到對應的flutter.jar進行api依賴胚想,此jar包里包括提供給java層調(diào)用的接口class類,和flutter引擎相關的libflutter.so芽隆。

  1. 創(chuàng)建Task :flutterBuild${buildType}

此task工作:執(zhí)行shell腳本${flutter.sdk}/bin/flutter腳本編譯Flutter工程顿仇,產(chǎn)物output:android/app/build/intermediates/flutter/${buildType}

最終執(zhí)行shell腳本大致上:${flutter.sdk}/bin/flutter build aot --release --target=lib/main.dart --output-dir=android/app/build/intermediates/flutter/${buildType}

最終在output目錄下面可以看到構(gòu)建產(chǎn)物

|
|---flutter_assets
|   |
|   |---...
|
|---frontend_server.d
|
|---gen_snapshot.d
|
|---isolate_snapshot_data   應用程序數(shù)據(jù)段
|
|---isolate_snapshot_instr  應用程序指令段
|
|---kernel_compile.d
|
|---kernel_compile.d.fingerprint
|
|---snapshot.d.fingerprint
|
|---vm_snapshot_data      虛擬機數(shù)據(jù)段
|
|---vm_snapshot_instr       虛擬機指令段

  1. 創(chuàng)建Task :copyFlutterAssets${buildType}

此task用于拷貝Task :flutterBuild${buildType}的產(chǎn)物到打包相關task需要的路徑(如mergeAssets的輸出路徑)用于最后打包

  1. 創(chuàng)建Task :copySharedFlutterAssets${buildType}

此task用于拷貝flutter.jar中assets/flutter_shared/icudtl.data文件到指定目錄,flutter1.2已經(jīng)不存在此文件摆马。

  1. 將創(chuàng)建的Task和android打包task進行dependsOn依賴臼闻,形成完整的app構(gòu)建鏈

最終編譯鏈中幾個主要task前后依賴順序

> Task :app:flutterBuild${buildType}
> Task :app:generate${buildType}Assets
> Task :app:merge${buildType}Assets
> Task :app:copyFlutterAssets${buildType}
> Task :app:package${buildType}
> Task :app:assemble${buildType}

Flutter Android運行

  1. flutter.jar

對Android而言,Andorid工程通過依賴flutter.jar來接入Flutter囤采,不同buildType依賴的flutter.jar不同述呐。flutter.jar提供了Android調(diào)用Flutter的java接口以及l(fā)ibflutter.so。

  1. libflutter.so

FlutterApplication中會去加載libflutter.so蕉毯。libflutter.so是flutter引擎部分乓搬,用于執(zhí)行dart、渲染等工作代虾。

  1. FlutterView

Android通過FlutterView加載flutter視圖进肯,F(xiàn)lutterActivity也是通過內(nèi)置FlutterView實現(xiàn)。FlutterView本質(zhì)是個SurfaceView棉磨,將Surface透過FlutterJNI傳入C層江掩,由flutter引擎進行調(diào)用渲染。

  1. vm/isolate_snapshot_data/instr

release采用AOT乘瓤,dart代碼編譯后產(chǎn)物vm/isolate_snapshot_data/instr环形,內(nèi)容均為arm指令,由flutter引擎載入執(zhí)行衙傀。vm_中涉及runtime等服務(如gc)抬吟,用于初始化DartVM,調(diào)用入口見Dart_Initialize(dart_api.h)统抬。isolate_則是對應了我們的App代碼火本,調(diào)用入口見Dart_CreateIsolate(dart_api.h)

  1. snapshot_blob.bin

debug模式采用JIT危队,引擎libflutter.so中有JIT支持的代碼,體積比release的要大一些钙畔,dart代碼存在于snapshot_blob.bin茫陆,支持hotReload等特性

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市刃鳄,隨后出現(xiàn)的幾起案子盅弛,更是在濱河造成了極大的恐慌钱骂,老刑警劉巖叔锐,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異见秽,居然都是意外死亡愉烙,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門解取,熙熙樓的掌柜王于貴愁眉苦臉地迎上來步责,“玉大人,你說我怎么就攤上這事禀苦÷希” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵振乏,是天一觀的道長蔗包。 經(jīng)常有香客問我,道長慧邮,這世上最難降的妖魔是什么调限? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮误澳,結(jié)果婚禮上耻矮,老公的妹妹穿的比我還像新娘。我一直安慰自己忆谓,他們只是感情好裆装,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著倡缠,像睡著了一般米母。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上毡琉,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天铁瞒,我揣著相機與錄音,去河邊找鬼桅滋。 笑死慧耍,一個胖子當著我的面吹牛身辨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播芍碧,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼煌珊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了泌豆?” 一聲冷哼從身側(cè)響起定庵,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎踪危,沒想到半個月后蔬浙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡贞远,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年畴博,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蓝仲。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡俱病,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出袱结,到底是詐尸還是另有隱情亮隙,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布垢夹,位于F島的核電站溢吻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏棚饵。R本人自食惡果不足惜煤裙,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望噪漾。 院中可真熱鬧硼砰,春花似錦、人聲如沸欣硼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诈胜。三九已至豹障,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間焦匈,已是汗流浹背血公。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缓熟,地道東北人累魔。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓摔笤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親垦写。 傳聞我的和親對象是個殘疾皇子吕世,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容