美文网首页flutter
Flutter 和 Android 混编以及各种坑

Flutter 和 Android 混编以及各种坑

作者: 啪哒 | 来源:发表于2019-12-02 01:26 被阅读0次

    Flutter 开发快,性能好,值得一用,但很多项目已然有成堆的 Native 代码了,如何才能在已有的基础上接入 Flutter 呢?

    新建 Flutter 用于混编

    这和情况是已经有 Native 项目或是 Native 项目单独开发,想接入一个全新的 Flutter 项目。

    • 使用 flutter create -t module xxx 方法新建 Flutter 项目。
    $ cd some/path/
    $ flutter create -t module --org com.example my_flutter
    

    这将创建一个 Flutter module,里面包含了 Dart 项目的 lib 文件和一个 .android.ios 用于编译 Module

    • 宿主 Android App 的环境依赖需要添加 Java8。添加下面代码于宿主 Android App 的 build.gradleandroid{} 模块中。
    android {
      //...
      compileOptions {
        sourceCompatibility 1.8
        targetCompatibility 1.8
      }
    }
    
    • 令宿主 Android App 依赖于 Flutter Module。

      依赖于 Android Archive (AAR)
      在 Flutter 项目中执行:$ flutter build aar生成文件会在build/host/outputs/repo中:

    build/host/outputs/repo
    └── com
        └── example
            └── my_flutter
                └── flutter_release
                    ├── 1.0
                    │   ├── flutter_release-1.0.aar
                    │   ├── flutter_release-1.0.aar.md5
                    │   ├── flutter_release-1.0.aar.sha1
                    │   ├── flutter_release-1.0.pom
                    │   ├── flutter_release-1.0.pom.md5
                    │   └── flutter_release-1.0.pom.sha1
                    ├── maven-metadata.xml
                    ├── maven-metadata.xml.md5
                    └── maven-metadata.xml.sha1
    

    也可以执行flutter build aar --debug生成debug包,进行测试。
    此处有第一个坑:生成的 aar 仅包含 Dart 项目本身的内容,若 Dart 项目中引用的库,例如 flutter_boost,库自身也是有对应的 Java/Kotlin 代码的内容,也会生成一个对应的 aar,这些 aar 都要加到宿主 Android App 项目当中方可。

    宿主 Android App 添加引用有有以下几种方式:

    1 直接复制到对应的 Android 项目app/libs中,接着于build.gradledependencies{}中添加:
    dependencies {
        // ...
        implementation(name: 'flutter_release-1.0', ext: 'aar')
    }
    

    name 为对应添加依赖包的名字,ext为对应依赖包的扩展名,此处为aar

    2 在 app 的build.gradle中添加本地 maven 目录:
    // MyApp/app/build.gradle
    
    android {
      // ...
    }
    
    repositories {
      maven {
        url 'some/path/my_flutter/build/host/outputs/repo'
        // This is relative to the location of the build.gradle file 
        // if using a relative path. 
      }
    }
    
    dependencies {
      // ...
      releaseCompile ('com.example.my_flutter:flutter_release:1.0@aar') {
        transitive = true
      }
    }
    

    也就是把本地生成 aar 的目录加为 maven 地址。debug模式:

    // MyApp/app/build.gradle
    
    dependencies {
      // ...
      debugCompile ('com.example.my_flutter:flutter_debug:1.0@aar') {
        transitive = true
      }
    }
    
    3 依赖于 Flutter 项目文件

    这样可以对 Android 和 Flutter 项目进行一键编译,但需在宿主项目中安装 Flutter SDK。
    在宿主项目中将 Flutter 项目以子项目方式引入,后于宿主settings.gradle中添加:

    // MyApp/settings.gradle
    include ':app'                                     // assumed existing content
    setBinding(new Binding([gradle: this]))                                 // new
    evaluate(new File(                                                      // new
      settingsDir.parentFile,                                               // new
      'my_flutter/.android/include_flutter.groovy'                          // new
    )) 
    

    其中settingsDir.parentFilesettings.gradle文件的父文件夹,evaluate(new File(path))中的path既指 Flutter 项目中flutter_project/.android/include_flutter.groovy的位置。setBinding方法和evaluate方法会将 Flutter 项目自身引入到settings.gralde中,即添加include :flutter。此操作也作包含 Flutter 项目引用的所有库,例如:package_info:video_player等。

    在 Android 项目中添加依赖:

    // MyApp/app/build.gradle
    
    dependencies {
      implementation project(':flutter')
    }
    

    引用文章:https://github.com/flutter/flutter/wiki/Add-Flutter-to-existing-apps

    一更结束。

    相关文章

      网友评论

        本文标题:Flutter 和 Android 混编以及各种坑

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