现有项目集成flutter排坑指南

一、channel环境的选择,我的建议是选择master,别以为stable稳就好,请看我们遇到了什么坑。

1、如果选择,stable,我们遇到的情况是,IOS上接入之后是跑不了的。切到master上就OK了。

2、如果选择stable,就没有flutter build aar,这种构建出一个aar的方式目前来看只有master版本才有。

二、iOS 不能设置初始路由,flutter官方说已经搞定了,but,尝试依然是拿不到,怎么办?

I solved the problem.
//=======================

@interface XXFlutterViewController : FlutterViewController

@EnD

(void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
FlutterEngine *flutterEngine = self.engine;

[GeneratedPluginRegistrant registerWithRegistry:flutterEngine];
//custom futter plugin
[XXXFlutterBridge registerWithRegistry:flutterEngine];
}

//open flutter vc
XXFlutterViewController *flutterViewController = [[XXFlutterViewController alloc] init];
[flutterViewController setInitialRoute:@"xxxxx/xxxx"];

感觉是执行时候环境没有准备好的问题,算是一个小坑把,详细可以参考下面链接。

https://github.com/flutter/flutter/issues/27882

@kidzss 的解答虽然没有赞,但是经过尝试,确实可以拿到了。

三、如果你在andriod项目中设置了abiFliter这个,你很可能面临着找不到libflutter.so的问题,怎么解决?

举个例子吧,比如,我的gradle中配置了这个

很显然,我为了减小包大小,看似做了这么一个优化,实际上在这里接入flutter就遇到了这个坑,我们到

flutter/bin/cache/artifacts/engine目录下看一下

好吧,flutter提供了很多不同的架构,那么针对我这种情况,我肯定就选择android-arm中的so了,进去看一下并没有,没有别慌,使用unzip解压那个flutter.jar,libflutter.so就出现了,够了吗?并没有,这只搞定了调试模式下的so文件,嗯,如果你知道flutter的不同模式下的运行机制的话(debugJIT,releaseAOT)你应该理解,此时还要去解压那个android-arm-relealse中的flutter.jar了,那么问题来了。

现在有两个libflutter.so,一个是debug用的,一个是release用的,我总不能全部放到lib/armeabi下面吧,当时不能这么做,嗯,貌似聪明的你想到了,使用sourceSets。debug.jniLibs.srcDirs = ['debug/libs']

这样,调试的时候使用的是debug目录的那个,打包的是,用的是release的了,眼睛比较精明的小伙伴已经发现了,两个libflutter.so的大小差距悬殊,为啥?因为debug模式是JIT模式的,这就意味着他比release模式的AOT要多作一些工作才能让代码跑起来,聪明你一定想到了Vue的带compile版本和不带compile版本,道理是一样的。

四、Must be able to initialize the VM.

没有遇到这哥们,我只能说你flutter玩得一点都不精彩,嗯,我遇到了,怎么办?

不急,还是先分析一下原因,这个过程发生在原生拉起一个flutter写的页面上,然后在从字面上理解,貌似是环境没起来,这就好比,我要执行一个.class文件,你JVM都每个我准备好,我在哪执行呢?so,我该如何解决呢?聪明的你肯定想到一定是打包的时候【我这里是打release包】,有些东西没有打进去,那么到底是什么东西没打进去呢?业界有两种说法。

1、一种是这些种文件assets/isolate_snapshot_data

2、一种是libapp.so

那么,到底哪种说法是:heavy_check_mark:的呢?答案是都是正确的,但是你去解决的时候又会哭爹喊娘,说人家欺骗你,实际不然,因为这个更flutter的版本有关。在flutter1.7.8版本之前说法1是正确的,在flutter1.7.8之后,说法2是正确的。因为flutter1.7.8之后libapp.so一位大哥替代了一群小弟。

解决的办法就是在构建的那个aar中,使用zip解压之后,去lib里面找那个libapp.so,然后copy到你的lib下面就OK啦,libapp.so只有release模式才使用得到,因此debug下面不需要放这个,debug模式会使用第一种方式,在assets下面添加那些snapshot文件。

当然,还有说,你项目做了flavors,所以,你的flutter工程也需要做一个类似配置,这么说也有一定的道理,但是经过我验证,这也是一个过时的说法,如果版本比较新,建议不要在这个坑上做太多的尝试了,而且,你修改flutter工程的build配置,一个flutter packages get,或者flutter clean 你的更改都将和你说good bye。

五、CI构建的问题

无论你在本地玩得多六六六,最终你还是要去持续集成的,因此我们需要考虑如果在蓝盾/RDM上构建的话,需要准备些什么,换句话说,在原来(原生)的基础上,我们多做一些什么呢?

1、git clone 我们的flutter工程代码到同级目录。

2、执行flutter packages get,等等,兰陵王的感叹号❗️❗️已经响起,你的机器上flutter环境装了吗?

3、所以要check一下flutter环境,好吧,假设环境也有,也假设你本地是最新的master版本,那么构建机器是和你的环境一致吗?不一致,不一致是不是要改成一致呢?这个是要外网的,搞不好还要访问外国网站,你有代理吗?

4、在等一下,请问你改了环境,其他同学要改为stable,是不是想一想就觉得混乱。

可以看到,太多的不确定因素会导致我们打包构建失败,怎么办,AAR模式来解救你,在flutter工程中flutter build aar,就会生成一个aar,然后就可以以一个库的形式引入进来了打包了。构建机器上压根不用flutter环境。等等,我怎么调试呢?我要CTRL+S就看到代码变化,没这个我可受不了。嗯,flutter提供了两种方式给我们已有的项目加flutter特性,

Depend on the module's source code 这个模式允许我们调试的时候,保存代码就看到修改效果。

Depend on the Android Archive (AAR) 这个模式解决了我们打包以来flutter环境的问题。

那么,怎么糅合两者的优势,成了我们的新问题,聪明的你又想到了,我们可以在gradle.properties定义环境参数isFlutterDebug=false,表示打包模式,isFlutterDebug = true表示调试模式。

然后:敲黑板,重点在这里,兰陵王的❗️❗️

1、在setting.gradle中,我们可以这样做,保证只有在调试模式的时候才做源码集成的方式

if(isFlutterDebug.toBoolean()){
    setBinding(new Binding([gradle: this]))                                 // new
    evaluate(new File(                                                      // new
        settingsDir.parentFile,                                               // new
        'tip_flutter/.android/include_flutter.groovy'                          // new
    )) 
}

 2、在app的build.gradle中,我们同样的方式来处理

repositories {
    flatDir {
        dirs 'libs'
    }
}

dependencies {
    if(isFlutterDebug.toBoolean()){
        implementation project(':flutter')
    }else{
        implementation(name:'flutter-release-1.0', ext:'aar'){
            transitive = true
        }
    }
}

 当然,我们在打包构建之前,需要在flutter工程中执行flutter build aar,来生成这个aar,在flutter工程output/host下面去找。找到aar,直接复制到你app的libs中即可。

对于IOS,我们也需要有一个类似的aar,在iOS 上应该叫做framework,通过执行这个flutter build aot --build-shared-library命令,就可以生成这个framework

六、使用aar方式集成之坑

官方提到使用repo那种,但是我经过多次尝试,始终编译不过,之后直接把aar放到libs下面,编译通过,考虑到transitive参数,表示会自动收集依赖,直接放到libs方式下目前没发现什么问题,也是一个行得通的方式。

七、其他一些小坑

1、每次切换分支,最好flutter upgrade一下,不然可能出现打包问题。

2、打包失败,考虑./gradlew clean一下。

3、打包出现OOM,此时可以在gradle.properties配置一下内存大小。

4、不能hot reload,那一定是姿势不对,flutter工程下flutter attach之后,native工程这边需要重新打一个调试包装到手机上,然后进入flutter模块才可以的。

5、我的机器打的调试包怎么跑不起来,出现了JNI nativie之类的一些错误提示,这类问题,优先考虑你的flutter版本和大家一致吗?channel和大家一致吗?

6、flutter-boost,我们尝试了一下,更新有点慢,目前还只支持flutter1.5,现在都1.7.8了,编译直接不过。

7、2x,3x图似乎加载不了,那是因为你使用了中文,flutter会把资源反倒一个mainifest中,它是一个map,如果使用中文,map的key就和路径对不上了,找不到的化,就会找默认图啦,也就是一倍图。

本站文章资源均来源自网络,除非特别声明,否则均不代表站方观点,并仅供查阅,不作为任何参考依据!
如有侵权请及时跟我们联系,本站将及时删除!
如遇版权问题,请查看 本站版权声明
THE END
分享
二维码
海报
现有项目集成flutter排坑指南
1、如果选择,stable,我们遇到的情况是,IOS上接入之后是跑不了的。切到master上就OK了。
<<上一篇
下一篇>>