创建一个Flutter工程
利用android studio创建
- Android Studio安装Flutter插件
- New Flutter Project
利用flutter脚本创建
- 安装flutter sdk ,配置环境变量Path
- 创建目录fluttertest,cd fluttertest
- 执行flutter create . 创建flutter工程,工程下有android、ios、lib等目录,android/local.properties会自动把flutter sdk的路径配置好
- 执行flutter packages get --verbose 安装依赖包
- 用Android Studio打开fluttertest工程即可编码,运行
Flutter工程目录说明
fluttertest
|
|---android
| |---build.gradle
| |---app
| |---build.gradle
|
|---ios
|
|---lib
|
|---pubspec.yaml
lib: dart源码目录
android:andorid应用构建目录
ios:ios应用构建目录
pubspec.yaml:flutter项目采用pub管理依赖,pubspec.yaml是配置文件
Flutter Android编译流程
- 在fluttertest目录下执行flutter run或者Android Studio点击运行按钮
- flutter run会调用到android目录下的gradlew执行gradle脚本来构建android工程
- android/app/build.gradle 会依赖 $flutterRoot/packages/flutter_tools/gradle/flutter.gradle
- flutter.gradle脚本作用是添加android项目编译的依赖库jar和so,以及将flutter编译任务插入android gradle编译链中
- 执行编译链所有task将dart和android工程一同进行编译成apk或aar产物
flutter.gradle主要工作
- addFlutterJarApiDependency增加flutter.jar的依赖
根据不同的buildType从sdk找到对应的flutter.jar进行api依赖,此jar包里包括提供给java层调用的接口class类,和flutter引擎相关的libflutter.so。
- 创建Task :flutterBuild${buildType}
此task工作:执行shell脚本${flutter.sdk}/bin/flutter脚本编译Flutter工程,产物output:android/app/build/intermediates/flutter/${buildType}
最终执行shell脚本大致上:${flutter.sdk}/bin/flutter build aot --release --target=lib/main.dart --output-dir=android/app/build/intermediates/flutter/${buildType}
最终在output目录下面可以看到构建产物
|
|---flutter_assets
| |
| |---...
|
|---frontend_server.d
|
|---gen_snapshot.d
|
|---isolate_snapshot_data 应用程序数据段
|
|---isolate_snapshot_instr 应用程序指令段
|
|---kernel_compile.d
|
|---kernel_compile.d.fingerprint
|
|---snapshot.d.fingerprint
|
|---vm_snapshot_data 虚拟机数据段
|
|---vm_snapshot_instr 虚拟机指令段
- 创建Task :copyFlutterAssets${buildType}
此task用于拷贝Task :flutterBuild${buildType}的产物到打包相关task需要的路径(如mergeAssets的输出路径)用于最后打包
- 创建Task :copySharedFlutterAssets${buildType}
此task用于拷贝flutter.jar中assets/flutter_shared/icudtl.data文件到指定目录,flutter1.2已经不存在此文件。
- 将创建的Task和android打包task进行dependsOn依赖,形成完整的app构建链
最终编译链中几个主要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调用Flutter的java接口以及libflutter.so。
- libflutter.so
FlutterApplication中会去加载libflutter.so。libflutter.so是flutter引擎部分,用于执行dart、渲染等工作。
- FlutterView
Android通过FlutterView加载flutter视图,FlutterActivity也是通过内置FlutterView实现。FlutterView本质是个SurfaceView,将Surface透过FlutterJNI传入C层,由flutter引擎进行调用渲染。
- vm/isolate_snapshot_data/instr
release采用AOT,dart代码编译后产物vm/isolate_snapshot_data/instr,内容均为arm指令,由flutter引擎载入执行。vm_中涉及runtime等服务(如gc),用于初始化DartVM,调用入口见Dart_Initialize(dart_api.h)。isolate_则是对应了我们的App代码,调用入口见Dart_CreateIsolate(dart_api.h)
- snapshot_blob.bin
debug模式采用JIT,引擎libflutter.so中有JIT支持的代码,体积比release的要大一些,dart代码存在于snapshot_blob.bin,支持hotReload等特性
网友评论