創(chuàng)建一個Flutter工程
利用android studio創(chuàng)建
- Android Studio安裝Flutter插件
- New Flutter Project
利用flutter腳本創(chuàng)建
- 安裝flutter sdk 柜某,配置環(huán)境變量Path
- 創(chuàng)建目錄fluttertest棘捣,cd fluttertest
- 執(zhí)行flutter create . 創(chuàng)建flutter工程障般,工程下有android伴奥、ios、lib等目錄撒强,android/local.properties會自動把flutter sdk的路徑配置好
- 執(zhí)行flutter packages get --verbose 安裝依賴包
- 用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編譯流程
- 在fluttertest目錄下執(zhí)行flutter run或者Android Studio點擊運行按鈕
- flutter run會調(diào)用到android目錄下的gradlew執(zhí)行g(shù)radle腳本來構(gòu)建android工程
- android/app/build.gradle 會依賴 $flutterRoot/packages/flutter_tools/gradle/flutter.gradle
- flutter.gradle腳本作用是添加android項目編譯的依賴庫jar和so飘哨,以及將flutter編譯任務插入android gradle編譯鏈中
- 執(zhí)行編譯鏈所有task將dart和android工程一同進行編譯成apk或aar產(chǎn)物
flutter.gradle主要工作
- addFlutterJarApiDependency增加flutter.jar的依賴
根據(jù)不同的buildType從sdk找到對應的flutter.jar進行api依賴胚想,此jar包里包括提供給java層調(diào)用的接口class類,和flutter引擎相關的libflutter.so芽隆。
- 創(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 虛擬機指令段
- 創(chuàng)建Task :copyFlutterAssets${buildType}
此task用于拷貝Task :flutterBuild${buildType}的產(chǎn)物到打包相關task需要的路徑(如mergeAssets的輸出路徑)用于最后打包
- 創(chuàng)建Task :copySharedFlutterAssets${buildType}
此task用于拷貝flutter.jar中assets/flutter_shared/icudtl.data文件到指定目錄,flutter1.2已經(jīng)不存在此文件摆马。
- 將創(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運行
- flutter.jar
對Android而言,Andorid工程通過依賴flutter.jar來接入Flutter囤采,不同buildType依賴的flutter.jar不同述呐。flutter.jar提供了Android調(diào)用Flutter的java接口以及l(fā)ibflutter.so。
- libflutter.so
FlutterApplication中會去加載libflutter.so蕉毯。libflutter.so是flutter引擎部分乓搬,用于執(zhí)行dart、渲染等工作代虾。
- FlutterView
Android通過FlutterView加載flutter視圖进肯,F(xiàn)lutterActivity也是通過內(nèi)置FlutterView實現(xiàn)。FlutterView本質(zhì)是個SurfaceView棉磨,將Surface透過FlutterJNI傳入C層江掩,由flutter引擎進行調(diào)用渲染。
- 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)
- snapshot_blob.bin
debug模式采用JIT危队,引擎libflutter.so中有JIT支持的代碼,體積比release的要大一些钙畔,dart代碼存在于snapshot_blob.bin茫陆,支持hotReload等特性