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.gradle
,android{}
模块中。
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
。
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.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')
}
引用文章:https://github.com/flutter/flutter/wiki/Add-Flutter-to-existing-apps
一更结束。
网友评论