Flutter framework在线上构建时的包大小优化
混合开发线上构建之flutter包大小优化
- 前景
- 打包flutter
- flutter引擎包的来源
- 缩减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过去
Flutter framework在线上构建时的包大小优化相关推荐
- Android 包大小优化总结
Android 包大小优化总结 众所周知,尽量减少 APP 安装包的大小是非常必要的,减少安装包大小,不仅减少了用户下载时的网络流量消耗,而且还减少了用户的下载等待时间.更重要的是安装包大小也会影响下 ...
- 抖音包大小优化-资源优化
1.概述 随着业务的快速迭代,抖音 Android 端的包大小爆发式增长.包大小直接影响到下载转化率.推广成本.运行内存和安装时间等因素,因此对 apk 进行瘦身是一件很有必要且收益很大的事情.apk ...
- 【前端教程】抖音包大小优化-资源优化
1.概述 随着业务的快速迭代,抖音 Android 端的包大小爆发式增长.包大小直接影响到下载转化率.推广成本.运行内存和安装时间等因素,因此对 apk 进行瘦身是一件很有必要且收益很大的事情.apk ...
- android apk包大小优化详解
1.使用开发工具 android studio Build > Analyz APK 2.文件说明 assets:存放一些配置文件 res:资源文件,图片.字符串.xml等 classes.de ...
- 在英特尔架构服务器上构建基于矢量包处理(VPP)的快速网络协议栈
在英特尔®架构服务器上使用矢量包处理(VPP)构建快速的网络栈 Build a Fast Network Stack with Vector Packet Processing (VPP) on an ...
- App Thinning(为什么苹果app上传时的包比在appStore下载下来的包大很多)
主要参考博客: App Thinning 文章目录 正式版 1. xx.xcarchive文件大小和目录,大小为389.5MB 2.选App Store Connect后Export出的文件,.ipa ...
- Php传图缩图,使用以下用于上传图像的PHP代码上传时缩小图像大小
当然,它工作正常.我在PHP中使用这个类: function thumbnail( $img, $source, $dest, $maxw, $maxh ) { $jpg = $source.$img ...
- 设置Laber上传时注意字体大小要统一,不然不生效
- U3D包大小优化之microlib
当迩想把最小类库发上来,迩需要把Stripping Level设置为Use micro mscorlib 这里是MICROLIB所能使用的包的类库列表:http://docs.unity3d.com/ ...
最新文章
- CSS Modules
- InnoDB 存储引擎体系架构
- Java开发程序员最值得学习的10大技术
- Django删除多对多表关系 :
- 让安全威胁无所遁形,全方位掌握攻击“前世今生”的黑科技来了
- torch.cuda.is_available(),torch.cuda.device_count(),torch.cuda.get_device_name(0)
- JavaScript OO不XX 学习总结
- 【DS3231 RTC实时时钟模块与Arduino接口构建数字时钟】
- DDoS是什么意思?
- 我国支付结算体系概况
- 美团点评 2019校园招聘 后台开发方向
- suse linux 光盘安装教程,suse11一键安装光盘制作
- 指数函数曲线拟合问题c语言,求助用指数函数拟合一组数据
- win7下搭载ubuntu双系统,独立引导
- cncert网络安全周报35期 境内被植入后门的政府网站112个 环比上涨24.4%
- 【点云3D目标检测】OpenPCDet下Spconv1.x与Spconv2.x的安装问题及解决方法
- Ubuntu常用软件安装与问题解决(持续更新)
- 解决ps默认打开显卡的设置
- 无公网服务器(ip)做内网穿透
- TestNG修改reportNG输出description