美文网首页
Flutter创建、编译到运行

Flutter创建、编译到运行

作者: HenryWarner | 来源:发表于2019-03-16 15:45 被阅读0次

    创建一个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创建、编译到运行

          本文链接:https://www.haomeiwen.com/subject/eydsmqtx.html