已有 Android 项目集成 Flutter 寻坑记

本文详细记录了一位开发者在将Flutter集成到现有项目中所遇到的挑战及解决方案,包括ABI配置、flutter_assets打包问题及模块命名的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文导读|   点击标题阅读

互联网寒冬下,程序员如何突围提升自己?

孤独后厂村,码农的故乡:30万互联网人跳不出的中国硅谷

“37岁,年薪50万,一夜被裁”:伪上班,毁掉了多少中国年轻人

作者:dengyin2000

链接:www.jianshu.com/p/d9cc2ff365c8

背景


 

Flutter作为谷歌下一代主推的全平台UI框架,具有很多的优点:

今年很多公司都在人员优化,移动端跨平台方案能够一定程度上节约开发成本,而且android ios都是一套代码,也避免了分端开发导致两端逻辑可能不一致的问题。

尝鲜

按照官方文档的指引https://github.com/flutter/flutter/wiki/Add-Flutter-to-existing-apps,很快我就完成了集成,但是一运行,进入flutter页面时,总是黑屏过段时间就闪退了,查看崩溃信息时发现应该是flutter so库没有打包进去,这个问题是因为我们的项目是只打包armeabi单abi。而flutter只提供armeabi-v7a以上的so。所以我们把abi改成armeabi-v7a就可以顺利打包flutter的so库了,如下:

    splits {        abi {            enable !project.hasProperty('runx86')            reset()            include 'armeabi-v7a'             universalApk false        }    }
        abi {
            enable !project.hasProperty('runx86')
            reset()
            include 'armeabi-v7a' 
            universalApk false
        }
    }

满心欢喜的赶紧build再次运行,结果还是一样,进入flutter页面,还是黑屏一下,然后闪退,这时候出现的error log是:

VM snapshot must be valid.Check failed: vm. Must be able to initialize the VM.Check failed: vm. Must be able to initialize the VM.

WTF:google之,发现一片非常有用的文章https://github.com/flutter/flutter/issues/19818在这篇文章中提到:

640?wx_fmt=other
vmfailed

看起来是说打包的apk的assets中缺少了flutter_assets,flutter_assets里面是什么?我猜他妈的肯定是dart vm还有dart的代码。这个哥们也比较实在,他说他也不知道为什么没有打包进去。于是按照这个哥们的方法,手工把flutter module编译出来的flutter_assets的拷贝到安卓项目中,然后重新编译打包,我手指微微颤抖的点开flutter页面,我操,flutter页面终于出来,我第一次流下了幸福的眼泪。但是幸福过后,还是要思考,我不能每次都手工拷贝吧,写个脚本拷贝也行,但是还是显得不太专业,我想要的是直接在IDE上点build按钮就能生成一个完美的apk包。

接着继续查看上面这个issue 19818(这个number还蛮吉利的),有个兄弟说是如果你的项目中有用到productFlavors的话,你的flutter项目也必须要配置相同的productFlavors才会自动把flutter_assets打包进去。按照下面这个方式进行代码调整:

640?wx_fmt=other
productFlavor

build打包运行,f**k,还是不行。flutter_assets怎样都打包不进apk里面。然后就是无尽的尝试,终于发现有一个中国的兄弟遇到跟我类似的问题https://www.jianshu.com/p/3a88d9b993cd

640?wx_fmt=other
fluttermaster

看起来是需要切到flutter的master分支上才可以,目前我是在stable分支上,那就切把,赶紧执行flutter channel master。这个过程需要翻墙,或者添加flutter中国镜像。要不然会下载不成功。切成功之后,试了无数次,还行不行。怎么办,我已经生无死恋……………………..

在经过多次痛哭流涕之后,我真想把电脑合上,背起书包回家(已经是深夜了),但是作为一个对技术有狂热追求的我,我不甘心就这样失败。也许是上帝的安排,冥冥之中我对比了下别的项目module名称都是app这样,而我们的却是vipshop。我想再尝试一把,不行的话,那我就放弃了。于是我把vipshop重命名为app,build运行。查看下apk打包的内容。

640?wx_fmt=other
done

flutter_assets终于打包进去了。进入flutter页面也没闪退了。呜呜… 今晚终于可以安心睡个好觉了。赶紧掏出手机叫好滴滴,打卡下班回家….

总结

整体的曲折经历上面已经说了,下面总结下具体的改动点,假设你的主工程和flutter module位于:

主要改动点有:

  1. flutter切到master分支,执行flutter channel master。

  2. 按照官方指引https://github.com/flutter/flutter/wiki/Add-Flutter-to-existing-apps进行集成。

  3. 确保你的主工程的主module名称是app,/somepath/my_app/app。

  4. 如果你的项目使用了abi splits,确认include的是armeabi-v7a。

    splits {        abi {            enable !project.hasProperty('runx86')            reset()            include 'armeabi-v7a'             universalApk false        }    }
        abi {
            enable !project.hasProperty('runx86')
            reset()
            include 'armeabi-v7a' 
            universalApk false
        }
    }
  1. 假设你的主项目配置了dev productFlavor,那么你需要修改 /somepath/flutter_module/.android/Flutter/build.gradle,增加dev productFlavor和buildTypes。

640?wx_fmt=other
productflavor
  1. 修改flutter项目 /somepath/flutter_module/.android/app/build.gradle,增加dev productFlavor

640?wx_fmt=other
productflavor
大功告成!!

更多学习和讨论,欢迎加入我们的知识星球,这里有1000+小伙伴,让你的学习不寂寞~·

看完本文有收获?请转发分享给更多人


我们的知识星球第三期开期了,已达到1100人了,能连续做三期已很不容易了,有很多老用户续期,目前续期率达到50%,说明了大家对我们的知识星球还是很认可的,欢迎大家加入尽早我们的知识星球,更多星球信息参见:

欢迎加入Java和Android架构社群

如何进阶成为Java的Android版和架构师?

说两件事

640?wx_fmt=jpeg

微信扫描或者点击上方二维码领取的Android \ Python的\ AI \的Java等高级进阶资源

更多学习资料点击下面的“阅读原文 ”获取

640?wx_fmt=gif

谢谢老板,点个好看↓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值