现有Android APP项目集成Flutter

 

背景

      我的app现在是原生加Weex混合开发,自从调研了flutter后,发现完全可以取代weex,达到更好的性能,更美观的界面,更丰富发组件等需求,flutter的原理和性能在这里不再多说,可自行查找资料与查看官网,强烈推荐使用原生加flutter的混合开发进行app开发,当然使用flutter也是有缺点的,后续会阐述,先讲一下我的集成路程与趟过的坑。

集成开始

1.add2app

      第一步在我们现有app项目中集成flutter的sdk,这一步网上有很多教程,建议大家这步看官网的教程add2App,这一步的注意点是flutter_module一定要和Android根目录同级,即app module目录的上一级,不是和app module同一级,切记!在这里app module目录的名称如果不是app,将存在一些问题,目录名称最好是app。

2.打debug包-在混合项目中打开flutter界面

     根据官网教程,这时候已经将flutter集成进我们的项目,我们就来打一个debug包,然后打开我们写的flutter界面吧。打debug包直接在app项目中build就可以了,然后装到手机里,打开app的flutter界面,如果成功打开,恭喜你,你跨过了很多没看到的坑,你的原app项目的第三方库没有造成冲突和影响,目前所知到的友盟、某些多渠道打包,都会对集成有影响,能成功打包却没有成功打开页面的出错日志应该有这一行错误信息:

[FATAL:flutter/shell/common/shell.cc(218)] Check failed: vm. Must be able to initialize the VM.

    这是因为你打的包没有flutter的dart文件导致,影响这个的原因太多了,原有项目一般已经有了很多第三方包,会导致这个问题,这里给出一个可行但蛋疼的办法——你可以单独将flutter_module打一个apk,然后解压apk,找到asset文件夹:

现有Android APP项目集成Flutter_第1张图片

打开该文件夹:

复制全部,粘贴到我们混合项目Android app的asset的目录下,然后再次打debug包,打开flutter界面,一定成功!这是flutter的debug模式的运行方式,大家可以查查flutter的运行原理。不过使用这个办法的缺点是无法使用flutter的热更新,每次打包都要解压复制文件,目前还要等待flutter官方进行优化。

3.打release包

在这一步你可能会遇到一些问题:

1)、打包出错,错误提示为:

More than one file was found with OS independent path 'lib/armeabi-v7a/libflutter.so'

libflutter.so包冲突,在这里我的flutter SDK版本为beta1.6.3,解决办法是在app module的build.gradle下加入以下代码:

packagingOptions {
    pickFirst 'lib/armeabi-v7a/libflutter.so'
}

解决!在dev 1.7.4 已经将该so文件变成了libapp.so,已经没有这个冲突问题,不过dev的bug太多,不建议使用该版本。

2)、打包成功,打开flutter页面闪退,错误为:

[FATAL:flutter/shell/common/shell.cc(218)] Check failed: vm. Must be able to initialize the VM.

 这个就是flutter资源包没有找到,采用上面的办法可以暂时解决。

3)、打包成功,打开flutter页面闪退,错误为乱码,在debug模式下运行没问题:

  我遇到的情况是因为我原项目是有做混淆代码的,然后flutter的release包也被混淆了,所以需要加入flutter的混淆配置:

  先在Android项目的gradle.properties文件中添加如下代码:

extra-gen-snapshot-options=--obfuscate

然后在app module的混淆文件中加入以下代码: 

#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.**  { *; }

4.结语

    这是我在集成flutter遇到的一些问题,用以上方法已成功在原有项目中集成flutter,但是还是存在打包无法将flutter资源包打包进asset文件夹的问题,看了flutter的打包源码也没有解决,希望有大佬可以指导一下如何解决,手动复制资源文件太蛋疼了,相信flutter以后会解决这个问题。最后是我觉得lutter的缺点,1.学习成本太高,需要从头开始,要做的很好,需要了解Android开发与ios开发;2.第三方库没有原生那么成熟,不过已经有很多成熟的第三方库,比如高德地图等,相信未来会越来越好,毕竟谷歌亲儿子,真的好用,秒杀目前市面上的混合开发。以后会继续写下我在flutter混合开发中的心得,欢迎探讨。

你可能感兴趣的:(现有Android APP项目集成Flutter)