参考Flutter:https://www.jianshu.com/p/cf7cf1b640ee,https://blog.csdn.net/u010479969/article/details/90671463
参考Nexus:https://blog.csdn.net/Michael_HM/article/details/78207279,https://www.cnblogs.com/yjmyzz/p/auto-upload-artifact-to-nexus.html
Flutter 工程通常有以下 4 种类型:
1. Flutter Application
标准的 Flutter App 工程,包含标准的 Dart 层与 Native 平台层,如果新项目基于flutter开发的话使用
2. Flutter Module
Flutter 组件工程,仅包含 Dart 层实现,Native 平台层子工程为通过 Flutter 自动生成的隐藏工程(.ios / .android),可以集成到Native中
3. Flutter Plugin
Flutter 平台插件工程,包含 Dart 层与 Native 平台层的实现,一些公共插件
4. Flutter Package
Flutter 纯 Dart 插件工程,仅包含 Dart 层的实现,往往定义一些公共 Widget。
官方提供的一种混编方案(https://github.com/flutter/flutter/wiki/Add-Flutter-to-existing-apps ),即在现有Native工程下创建 Flutter Module 工程,以本地依赖的方式集成到现有的 Native 工程中。
但是这种方式Flutter和Native耦合性太高,需要解耦,应该是阿里咸鱼团队最初提出的方案,将Flutter工程Native的依赖抽取出来在Native中引用。
看了一下阿里、美团还有马蜂窝的抽取文章要么比较早要么一些细节没注明,最后参考https://blog.csdn.net/u010479969/article/details/90671463完成了Flutter Module工程Android包的抽取
先声明一下名词:
Flutter Module工程:自己新建的Flutter Module工程
Android Native工程:已有的Android Native项目或者新建一个
Flutter Module工程下的Android工程:Flutter Module工程下的Native平台子工程目录为根目录下的.android
1、需要一个Android Native工程,可以使已有的Android Native工程,或者新建一个
2、新建Flutter Module工程(我觉得这里新建Flutter Module工程或者Flutter Application工程都可以,我是用的Flutter Module工程,有用Flutter Application工程成功集成的话可以反馈下),和Android Native工程是独立的,两者没有关联,最后build的Flutter arr包才会依赖到Android Native工程。(官方提供的混编方案是推荐放到Android Native同级目录)
flutter create -t module -a kotlin flutter_module 因为Android Native工程是kotlin写的这里加上了kotlin支持,如下project视图
3、在Flutter Module项目根目录的.android/app/build.gradle文件加入编译配置,不然Flutter Module项目起不来
compileOptions {
sourceCompatibility 1.8
targetCompatibility 1.8
}
4、接下来需要将Flutter Module工程下的Android工程打包arr上传到Maven供Android Native工程使用,用Nexus在本地建了一个Maven库并将arr上传,有Maven库的话这步就不用了
参考https://blog.csdn.net/Michael_HM/article/details/78207279,https://www.cnblogs.com/yjmyzz/p/auto-upload-artifact-to-nexus.html
一个需要注意的问题就是admin默认密码不是admin123了,默认会在nexus同级资源目录sonatype-work\nexus3\admin.password 文件,登录修改admin密码后文件会消失
5、将https://blog.csdn.net/u010479969/article/details/90671463博主提供的两个文件cp到Flutter Module根目录下的.android/Flutter中,在这个目录下的build.gradle文件中引入flutter_maven.gradle
apply from: "flutter_maven.gradle"
upload_maven.gradle里有一些变量需要配置,可以放到Flutter Module根目录下的gradle.properties中,或者gradle用户配置文件/Users/xxx/.gradle/gradle.properties中
我直接放到工程文件里了
6、Flutter Module根目录下的.android目录执行编译命令,上传工程,至此Flutter Module这边的工作已经完成了,在maven库里能看到生成的arr包
gradlew clean assembleRelease
gradlew uploadArchives
7、到Android Native工程引入,先需要修改下Android Native工程根目录下的app/build.gradle文件,不然flutter引入进去也会build失败
1)、增加编译选项
compileOptions {
sourceCompatibility 1.8
targetCompatibility 1.8
}
2)、修改minSdkVersion为16
3)、解决debug包 Failure [INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res=-113] 问题,增加splits配置
splits {
abi {
enable true
reset()
include 'armeabi-v7a', "x86"
universalApk true
}
}
4)增加maven库配置
repositories {
maven {
url "maven库url"
credentials {
username 'maven库用户名'
password 'maven库密码'
}
}
}
5)引入arr,dependencies增加implementation GROUP,ARTIFACT_ID,VERSION_NAME是你自己打包时gradle.properties里的配置
dependencies {
// 引入flutter maven依赖包
implementation 'GROUP:ARTIFACT_ID:VERSION_NAME@aar'
}
8、build下工程没问题的话就可以参考https://www.jianshu.com/p/cf7cf1b640ee写原生和Flutter的胶水代码了,在原生的首页写了一个jumpButton,点击后跳转的Flutter首页,
这里是kotlin的代码,java代码也差不多的调用。还有个问题就是build的出来的x86包没有libflutter.so库在模拟器运行失败,直接在真机运行没问题,这个谁解决了告我下