Android Flutter混编_Flutter 和 Android 混编以及各种坑
2021-01-13 17:47:35 By: shinyuu
Flutter 开发快,性能好,值得一用,但很多项目已然有成堆的 Native 代码了,如何才能在已有的基础上接入 Flutter 呢?
新建 Flutter 用于混编
这和情况是已经有 Native 项目或是 Native 项目单独开发,想接入一个全新的 Flutter 项目。
使用 flutter create -t module xxx 方法新建 Flutter 项目,当然这里也可以使用菜单的方式新建,File --> New --> New Module --> Flutter Module。
$ cd some/path/ $ flutter create -t module --org com.example my_flutter
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.gradle的dependencies{}中添加:
dependencies { // ... implementation(name: ´flutter_release-1.0´, ext: ´aar´) }
name 为对应添加依赖包的名字,ext为对应依赖包的扩展名,此处为aar。
// 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:[email protected]´) { transitive = true } }
也就是把本地生成 aar 的目录加为 maven 地址。debug模式:
// MyApp/app/build.gradle dependencies { // ... debugCompile (´com.example.my_flutter:flutter_debug:[email protected]´) { 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.parentFile指settings.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´) }