Flutter创建、编译到运行

创建一个Flutter工程

利用android studio创建

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

利用flutter脚本创建

  1. 安装flutter sdk ,配置环境变量Path
  2. 创建目录fluttertest,cd fluttertest
  3. 执行flutter create . 创建flutter工程,工程下有android、ios、lib等目录,android/local.properties会自动把flutter sdk的路径配置好
  4. 执行flutter packages get --verbose 安装依赖包
  5. 用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编译流程

  1. 在fluttertest目录下执行flutter run或者Android Studio点击运行按钮
  2. flutter run会调用到android目录下的gradlew执行gradle脚本来构建android工程
  3. android/app/build.gradle 会依赖 $flutterRoot/packages/flutter_tools/gradle/flutter.gradle
  4. flutter.gradle脚本作用是添加android项目编译的依赖库jar和so,以及将flutter编译任务插入android gradle编译链中
  5. 执行编译链所有task将dart和android工程一同进行编译成apk或aar产物

flutter.gradle主要工作

  1. addFlutterJarApiDependency增加flutter.jar的依赖

根据不同的buildType从sdk找到对应的flutter.jar进行api依赖,此jar包里包括提供给java层调用的接口class类,和flutter引擎相关的libflutter.so。

  1. 创建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       虚拟机指令段

  1. 创建Task :copyFlutterAssets${buildType}

此task用于拷贝Task :flutterBuild${buildType}的产物到打包相关task需要的路径(如mergeAssets的输出路径)用于最后打包

  1. 创建Task :copySharedFlutterAssets${buildType}

此task用于拷贝flutter.jar中assets/flutter_shared/icudtl.data文件到指定目录,flutter1.2已经不存在此文件。

  1. 将创建的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运行

  1. flutter.jar

对Android而言,Andorid工程通过依赖flutter.jar来接入Flutter,不同buildType依赖的flutter.jar不同。flutter.jar提供了Android调用Flutter的java接口以及libflutter.so。

  1. libflutter.so

FlutterApplication中会去加载libflutter.so。libflutter.so是flutter引擎部分,用于执行dart、渲染等工作。

  1. FlutterView

Android通过FlutterView加载flutter视图,FlutterActivity也是通过内置FlutterView实现。FlutterView本质是个SurfaceView,将Surface透过FlutterJNI传入C层,由flutter引擎进行调用渲染。

  1. 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)

  1. snapshot_blob.bin

debug模式采用JIT,引擎libflutter.so中有JIT支持的代码,体积比release的要大一些,dart代码存在于snapshot_blob.bin,支持hotReload等特性

你可能感兴趣的:(Flutter创建、编译到运行)