当前位置: 首页 > 工具软件 > flutter-im > 使用案例 >

Flutter-Android快速集成

廖华翰
2023-12-01

之前有篇文章写如何遇坑填坑的,有想看我啰嗦的,可以看下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就可以了
复制代码

开始集成

  1. AndroidClient和FlutterClient放到同级目录下
  2. 将FlutterClient根目录下include_flutter.groovy文件,复制到AndroidClient根目录
  3. 修改AndroidClient根目录下settings.gradle,添加如下内容
inclule ':app',
        ':coreLib',
        ':shareLib',
        ':mineLib',
        ':flutterLib'
        
//添加如下两行内容,原因可以看下开头提到的那篇比较啰嗦的文章
setBinding(new Binding([gradle: this]))
evaluate(new File('include_flutter.groovy'))
复制代码
  1. 修改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下应该能看到如下

  1. 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。

  1. 混淆

如果项目混淆的话,需要把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.**  { *; }
复制代码

转载于:https://juejin.im/post/5c0e07495188252bf829e5c0

 类似资料: