Flutter framework在线上构建时的包大小优化

Flutter framework在线上构建时的包大小优化,第1张

混合开发线上构建之flutter包大小优化 前景打包flutterflutter引擎包的来源缩减fluter framework大小总结

前景

因为项目要使用jenkins线上构建,所以整个项目的资源都要上传到git或者svn仓库里面,而某些仓库有大小限制,超过一定大小,就会不让上传,同时因为一个flutter的release的framework占据有几百M,你代码上传、拉取都会变得很慢,也影响构建的速度。
针对这一现象,就要考虑如何去做进一步优化。

打包flutter

线上构建使用flutter自带的命令flutter build ios --no-codesign --release进行打包,通过这个命令后,会在flutter宿主中的build文件内产生一个iOS的文件夹,就是打包出来的成果物,在Release-iphoneos文件夹下就是打包出来的framework。

这里因为是使用flutter module,还有flutter plugin开发,而且混合开发有引入的内网的三方库,导致如果直接按照官方打包flutter build ios-framework会拉不下内网的三分库。


flutter引擎包的来源

flutter build ios这个命令在源码中,追踪Framework来源比较复杂,涉及到Xcode命令,里面逻辑比较复杂,只是全局搜索到了一个xcode脚本内,包含了相关代码,如果有研究兴趣的,可以私信我,或者等候我之后分享的文章,里面可以真机调试源码,直接打断点。

所以我们使用另外一个命令flutter build ios-framework来追踪源码,猜测大致来源。

这是终端命令行的输出内容,然后我们比对源码。

从这里就很明显的看出,当输入参数不含cocoapods时,会直接copyFlutter的framework包

,从截图的终端命令里面也能看出来,是├─Copying Flutter.xcframework...,追踪源码,flutter的framework包存放在本地的flutter版本内,本地flutter位置/bin/cache/artifacts/engine

参数cocoapods,是指不会直接打出flutter的framework,而是打出一个podspec文件,在我们项目中去引用这个podspec。



这里也包含了android相关的包

查看当前flutter位置,可以使用终端命令which flutter
flutter命令的源码在当前flutter环境所在位置/packages/flutter_tools

缩减fluter framework大小

上面步骤已经成功打出了flutter的引擎包和相关的代码,但是一个flutter的framework很大,2.0.1的有440M。我们线上的就是直接把这个framework包拿过去用了,因为线上构建,所以这个440M的包也上传到项目内,这里就是优化的点,一个项目可能大就大了,但是项目很多的时候,每个仓库里面都占了很大内存,其次,一个flutter版本对应一个稳定的flutter的framework,没必要上传上去。

release对应的flutter包很大,debug和profile模式对应的要小很多

首先想到的一种方案就是,我们可以把这个flutter的framework提取出来,使用podspec去引用,这样线上仓库不会占用很大面积,得到包大小优化,但是这样,只是线上仓库得到优化,每次拉取三方库后,依旧会让整个项目的大小很大,所以有了进一步优化。
当我们项目打完包之后,发现大小并没有几百M,通过查看ipa内部,发现flutter只有14.7M
通过查资料发现,Xcode对framework在打包发布时有一定优化处理,剥离bitcode,去除了很多无用的代码和资源,导致包的大小又缩减一层,直接编译,虽然禁用了bitcode,但是没有做剥离 *** 作,这里就是我们最终优化的方案。

注意:
默认的framework是enable bitcode,这样会导致项目编译失败;
我们使用的flutter的framework会设置bitcode为NO,只是禁用,但是没有剥离bitcode相关的代码和资源。

使用Xcode自带的命令xcrun bitcode_strip -r Flutter.framework/Flutter -o Flutter.framework/Flutter,我们对440M的可执行文件进行 *** 作,大小变成了14.4M和最后的14.7M还是有点差距
后来经过测试,我们直接把14.4M的flutter的framework拖进项目中,然后去打包出一个ipa,最后发现包的大小依然是14.7M,证明我们的 *** 作没有错误,应该是Xcode对framework做了签名之类的 *** 作,导致大小增加了一点。

测试了一下,去除bitcode后,直接拖进项目中,不影响flutter项目的运行与使用

同理,我们可以对打包出来的App.framework也可以进行剥离bitcode *** 作,减小framework包的大小。

App.framework这是我们编写的flutter的代码打出来的包

总结

最后优化步骤为:

提取flutter的framework和App.framework脚本命令剥离bitcode,使用xcrun bitcode_strip -r Flutter.framework/Flutter -o Flutter.framework/Flutter放在自己的受控库中,使用podspec拉取framework,或者在线上构建时就直接多做一步,因为大小缩减了很多,可以不用上传受控库

注意事项:这里仅限flutter打包成framework后,再引入到原生项目中,这样 *** 作可以减小仓库大小,平时flutter开发时,依然使用完整的flutter的framework,而且每次pub get后,还会从sdk环境copy过去

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/993059.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存