关于Flutter和Android混合开发maven方式打包引用调用

参考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库在模拟器运行失败,直接在真机运行没问题,这个谁解决了告我下

猜你喜欢

转载自www.cnblogs.com/nightfallsad/p/11314181.html
今日推荐