之前有篇文章写如何遇坑填坑的,有想看我啰嗦的,可以看下Flutter-Android填坑之旅。
这篇直接说下我们现有的集成方式
项目背景简单介绍一下:
已有Android项目,其他同事已开发完Flutter项目,现将Flutter项目集成到Android项目中。
Android项目,项目目录如下
AndroidClicent
app
coreLib
shareLib
mineLib
flutterLib//这个是新建的,flutter跳转将放在这里
复制代码
Flutter项目,项目目录如下
FlutterClient
.android
.ios
...
lib
.flutter-plugins
...
正常的Flutter工程目录
复制代码
PS:有些人的Flutter项目中没有.android .ios等目录。
在Flutter根目录下面,执行命令flutter packages get就可以了
复制代码
开始集成
- AndroidClient和FlutterClient放到同级目录下
- 将FlutterClient根目录下include_flutter.groovy文件,复制到AndroidClient根目录
- 修改AndroidClient根目录下
settings.gradle
,添加如下内容
inclule ':app',
':coreLib',
':shareLib',
':mineLib',
':flutterLib'
//添加如下两行内容,原因可以看下开头提到的那篇比较啰嗦的文章
setBinding(new Binding([gradle: this]))
evaluate(new File('include_flutter.groovy'))
复制代码
- 修改
include_flutter.groovy
文件
def scriptFile = getClass().protectionDomain.codeSource.location.path
def flutterProjectRoot = new File(scriptFile).parentFile.parentFile
gradle.include ':Flutter' //这里我把flutter改成了Flutter,因为我们的module都是大写字母开头
gradle.project(':Flutter').projectDir = new File(flutterProjectRoot, 'FlutterClient/.android/Flutter')
//这里两处修改project(':Flutter')同样是module大小写问题
//另外一处是: new File(flutterProjectRoot, '.android/Flutter')改为 new File(flutterProjectRoot, 'FlutterClient/.android/Flutter')。修改之后,路径才是正确的。如果按照官网WIKI修改,不用修改就行。
def plugins = new Properties()
def pluginsFile = new File(flutterProjectRoot, 'FlutterClient/.flutter-plugins')
if (pluginsFile.exists()) {
pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
}
//这里一处修改def pluginsFile = new File(flutterProjectRoot, '.flutter-plugins')改为def pluginsFile = new File(flutterProjectRoot, 'FlutterClient/.flutter-plugins')。修改之后,插件module才会加载成功。如果按照官网WIKI修改,不用修改就行。
plugins.each { name, path ->
def pluginDirectory = flutterProjectRoot.toPath().resolve(path).resolve('android').toFile()
println "plugin path is " + pluginDirectory.path
gradle.include ":$name"
gradle.project(":$name").projectDir = pluginDirectory
}
gradle.getGradle().projectsLoaded { g ->
g.rootProject.afterEvaluate { p ->
p.subprojects { sp ->
if (sp.name != 'flutter') {
sp.evaluationDependsOn(':Flutter')
}
}
}
}
//这里一处修改sp.evaluationDependsOn(':Flutter'),同前面大小写问题。
复制代码
同步一下gradle文件,AS的Project下应该能看到如下
- libflutter.so文件处理
如果项目中需要支持armeabi可以进行如下操作,文章Flutter-Android填坑之旅第二坑、第三坑有提到:
如果debug模式,需要用到$FLUTTER_ROOT/bin/cache/artifacts/engine/android-arm下的so。
如果是release模式,需要用到$FLUTTER_ROOT/bin/cache/artifacts/engine/android-arm-release下的so。
这块做个可以做如下处理:
debug文件夹存放android-arm下的so。main文件夹下面存放android-arm-release下的so。
- 混淆
如果项目混淆的话,需要把flutter相关的混淆添加一下
#Flutter Wrapper
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.** { *; }
-keep class io.flutter.util.** { *; }
-keep class io.flutter.view.** { *; }
-keep class io.flutter.** { *; }
-keep class io.flutter.plugins.** { *; }
复制代码