主工程android与flutter混合开发指引(windows10系统)
遇到很多混合开发说主工程不用androidx, 但是flutter用androidx怎么办?
大多数方案都是说把主工程升级为androidx.
这里给一个不升级的参考方案。
1.主工程android现状
目前公司内造新APP一般涉及登录,收藏,以及各种接口模块,从Smart原则看很难开一个APP去做。
大多时候是从航母改代码,加上fluttermodule做混合开发。
因主工程代码没有使用androidx,且部分surpport包是改过的,使用androidx会造成了一些包重复引用,以及编译失败的问题。
所以,flutterSDK和flutter工程以及插件的android代码都要改成不用androidx.
1.如何从主工程快速改新APP?先不讲,有需要可以评论留言
2.为何主工程support.jar包会和androidx有包重复引用问题, 且要改为不用androidx?
过去为了满足一些引用,surpport包被人为加入了一些类,而这些类刚好是androidx也有的。
更重要的是androidx里面会有一些support同包名类名的东西。
又不能通过gradle中的all.exclude排除掉对应的group和module,所以修改成本很大。
加上编译链和打包只需so和asset资源,不需引入androidx,故而选择修改flutter为不使用androidx。
2.Flutter SDK配置
主要改了1点,将flutter\packages\flutter_tools\gradle\flutter.gradle中的:app改成主工程名,目的是gradle查到主工程。
将flutter_windows_1.17.1-stable.zip解压,设置到AndroidStudio。
3.混合开发集成介绍
拿主工程android举例,参考remix项目主工程分支remix/dev.
rootProject = GradleScript
rootProject.projectDir.absolutePath = C:\KGCode\V0\android\GradleScript
1.新建fluttermodule, clone并放到android目录下, androidkugou\GradleScript\setting.gradle 末尾添加如下代码
setBinding(new Binding([gradle: this, mainModuleName: 'android'])) evaluate(new File( settingsDir, '../Remix/kg_remix/.android/include_flutter.groovy' //这里是对应fluttermoudle的目录Remix/kg_remix ))这里需要留意一点,Remix\kg_remix.android\local.properties里面可能需要配置路径如下(目录按自己的来) flutter.sdk=C:\KGCode\flutter_windows_1.17.1-stable\flutter
2.android里面新加一个moduleFluttersdk (这是一个新module)
moduleFluttersdk做什么用?
里面存放去掉androidx的flutter_embedding相关代码,主要包括libflutter.so和android代码io.flutter包,
提供给需要引用一些demo代码使用。
flutter_embedding代码是flutter运行时依赖的官方库代码,gradle下载后出现在(本机目录如下)
C:\Users\masonxu.gradle\caches\modules-2\files-2.1\io.flutter
注意2点:
1.主工程内so只对齐了arm,所以flutter的debug和release在主工程使用对应的v7a的so即可。
2.io.flutter包是flutter_embedding的代码, 里面会使用annotation,activity等,去掉androidx,在moduleFluttersdk/build.gradle改为dependencies { compileOnly files('../thirdpartySdk/jars/kg-custom-android-support-v4_r26.jar') compileOnly files('../thirdpartySdk/jars/support-annotations-V26.1.0.jar') }3.android里面新加一个moduleFlutter
里面存放flutter入口和一些插件代码,提供给主工程代码使用。//注意2点: //1.要引用flutter和对应的flutter插件 api project(':flutter') api project(path: ':flutter_boost') //2.对一些运行会重复引用的module做排除处理 configurations { all*.exclude group: 'com.android.support', module: 'support-fragment' all*.exclude group: 'com.android.support', module: 'support-annotations' all*.exclude group: 'android.arch.lifecycle', module: 'runtime' all*.exclude group: 'android.arch.lifecycle', module: 'common' all*.exclude group: 'androidx.core', module: 'core' }
4.Flutter改androidx
1.FlutterSDK改androidx
就是将flutter_embedding代码中使用androidx的代码改成使用我们自己的jar包
2.Flutter插件改androidx, 举例flutterboost, 改之后是flutter仓库里面的flutter_boost-1.17.1-kg.zip
修改内容如下:
1.将flutter_boost-1.17.1\android\gradle.properties里面
android.useAndroidX=false android.enableJetifier=false2.修改flutter_boost-1.17.1\android目录的build.gradle,加上
Project androidkugouProject = rootProject.project("android") Project thirdpartySdkProject = androidkugouProject.project("thirdpartySdk") String thirdpartySdkPath = thirdpartySdkProject.projectDir.absolutePath dependencies { compileOnly files(thirdpartySdkPath + '\\jars\\kg-custom-android-support-v4_r26.jar') compileOnly files(thirdpartySdkPath + "\\jars\\support-annotations-V26.1.0.jar") }3.将flutter_boost-1.17.1\android\src中的androidx代码替换为上面jar包的引用
4.将改好的io.flutter也放到flutter_boost-1.17.1\android\src. 这一步是为了防止自动去加载flutter_embedding源码中的androidx
修改完毕,将新包放到指定仓库,在Remix\kg_remix工程的pubspec.yaml中加上引用即可。
运行flutter pub get,插件的代码会出现在如下目录
C:\KGCode\flutter_windows_1.17.1-stable\flutter.pub-cache\git\OSPlatSDK-b17343366641637ab78e937232f4c8495819d49b\thridparty
flutter_boost:
git:
url: 自己github地址
ref: develop
path: thridparty/flutter_boost-1.17.1-kg
疑问?
为什么插件新增一份改过io.flutter源码?
如果不加改过io.flutter,那么gradle构建时,就会自动下载flutter官方使用flutter_embedding的代码。
进而引起各种编译问题,当然这个问题可以解决,有2个方案:
1.使用flutter本地引擎,加载代码在flutter\packages\flutter_tools\gradle\flutter.gradle.
具体怎么用,目前看网上还没有正式方案。有待考究
2.修改flutter远程官方的maven库,然后修改代码重新发布,这个可行有待尝试但费时较多复杂度较高,还要研究flutter.gradle和一些其他编辑链相关的配置。???为什么flutterboost插件不直接使用moduleFluttersdk里面的io.flutter.
当然理论上是可行的,但目测可能有什么依赖关系导致不能依赖,目前还没有找到方法。
还有个办法,就是造一个flutter插件包含改过的io.flutter,然后所有插件都依赖它。