谈⼀谈AndroidFlutter混合开发问题
之前介绍过⼀些Android Flutter混合开发的注意点以及⼀些基本知识, 接下来介绍⼀下实际开发过程中,⽬前⼀定会遇到的两个坑。
在Flutter开发过程中,如果是以module的形式进⾏依赖,是⽆法进⾏android原⽣部分的调试的,⽆法进⾏attach debug to android process操作; 为了解决这⼀问题,我们需要考虑使⽤aar的⽅式,以library的形式进⾏依赖,但是讲flutter打包成library的时候,如果使⽤第三⽅框架,会导致第三⽅框架⽆法打包进⼊aar,因此我们需要来解决这⼀问题。
混合开发的依赖⽅式
打包成独⽴aar
打包aar很简单,进⼊flutter⼯程,然后进⼊.android⽬录,输⼊指令: 打debug的aar包:
./gradlew flutter:assembleDebug
打debug的release包:
./gradlew flutter:assembleRelease
打好的包在 flutter module/.android/Flutter/build/outputs/aar
aar的包打好后可以直接复制到Android⼯程去依赖即可。
但是如果使⽤第三⽅框架会导致第三⽅框架的⽆法打⼊aar,我们可以使⽤来解决这⼀问题:
在flutter⼯程的adle加⼊:
classpath 'com.kezong:fat-aar:1.2.7'
在Flutter的adle加⼊如下配置:
apply plugin: 'com.kezong.fat-aar'
dependencies {
def flutterProjectRoot = rootProject.Path()
def plugins = new Properties()
def pluginsFile = new File(), '.flutter-plugins')
if (ists()) {
pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
}
plugins.each { name, _ ->
println name
embed project(path: ":$name", configuration: 'default')
}
}
在Android⼯程下的adle中加⼊如下配置:
def flutterProjectRoot = rootProject.Path()
def plugins = new Properties()
def pluginsFile = new File(), '.flutter-plugins')
if (ists()) {
pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
}
plugins.each { name, path ->
def pluginDirectory = solve(path).resolve('android').toFile()
include ":$name"
project(":$name").projectDir = pluginDirectory
}
这样打包出来的aar就包含了第三⽅的aar。
混合开发的调试填坑
Flutter android混合⼯程的依赖⽅式写到这⾥,但是实际开发中会有⼀个⽆法避免的坑,就是flutter⼯程⽆法调试android代码,如下图所⽰例:
原⽣Android项⽬:
Flutter项⽬:
为了解决这⼀问题,我想到的解决⽅法就输使⽤aar模式来进⾏原⽣Android的开发,⽤依赖module的⽅式来进⾏flutter⼯程的开发。
开发模式参数配置
我们可以通过⼀个变量来控制当前开发环境是Android还是Flutter,效果如下:
通过gradle.properties的⼀个值来控制进⾏flutter开发还是Android部分开发。
具体操作如下:
1、讲Flutter部分打包成aar放⼊libs⽂件夹下
2、Android⼯程的project的adle加⼊如下依赖:
classpath 'com.kezong:fat-aar:1.2.7'
3、app的adle加⼊如下配置:
dependencies{
def properties = new Properties()
def pluginsFile = new File("${AbsolutePath()}/gradle.properties")
if (ists()) {
pluginsFile.withReader('UTF-8') { reader -> properties.load(reader) }
}
def isFlutterDebug = Property('isFlutterDebug').toBoolean()
if (isFlutterDebug) {
implementation project(':flutter')
} else {
implementation files('libs/flutter-release.aar')
//        implementation files('libs/flutter-debug.aar')
}
}
4、gradle.properties加⼊如下参数来控制调试⽅式:
## 是否在线调试flutter代码
isFlutterDebug=false
5、adle修改为如下配置:
xxx_flutter为⾃⼰flutter⼯程的名字。
def properties = new Properties()原生安卓app开发
def rootProjectFile = new Path()).getAbsolutePath()
def propertiesFile = new File("${rootProjectFile}/gradle.properties")
if (ists()) {
propertiesFile.withReader('UTF-8') { reader -> properties.load(reader) }
}
def isFlutterDebug = Property("isFlutterDebug").toBoolean()
if (isFlutterDebug) {
setBinding(new Binding([gradle: this]))
evaluate(new File(settingsDir.parentFile,
'xxx_flutter/.android/vy'
))
include ':xxx_flutter'
project(':xxx_flutter').projectDir = new File('../xxx_flutter')
}else {
def flutterProjectRoot = rootProject.Path()
def plugins = new Properties()
def pluginsFile = new File(), '.flutter-plugins')
if (ists()) {
pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
}
plugins.each { name, path ->
def pluginDirectory = solve(path).resolve('android').toFile()        include ":$name"
project(":$name").projectDir = pluginDirectory
}
}
这样配置完成后就可以由⾃⼰来控制到底进⾏Flutter开发还是Android开发。总结
Flutter开发的坑还有不少,以此记录⽅便⼤家来解决问题。
今年年初我花⼀个⽉的时间收录整理了⼀套知识体系,如果有想法深⼊的系统化的去学习的,可以私信我【安卓】,我会把我收录整理的资料都送给⼤家,帮助⼤家更快的进阶。