混合开发线上构建之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的代码打出来的包

总结

最后优化步骤为:

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

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

Flutter framework在线上构建时的包大小优化相关推荐

  1. Android 包大小优化总结

    Android 包大小优化总结 众所周知,尽量减少 APP 安装包的大小是非常必要的,减少安装包大小,不仅减少了用户下载时的网络流量消耗,而且还减少了用户的下载等待时间.更重要的是安装包大小也会影响下 ...

  2. 抖音包大小优化-资源优化

    1.概述 随着业务的快速迭代,抖音 Android 端的包大小爆发式增长.包大小直接影响到下载转化率.推广成本.运行内存和安装时间等因素,因此对 apk 进行瘦身是一件很有必要且收益很大的事情.apk ...

  3. 【前端教程】抖音包大小优化-资源优化

    1.概述 随着业务的快速迭代,抖音 Android 端的包大小爆发式增长.包大小直接影响到下载转化率.推广成本.运行内存和安装时间等因素,因此对 apk 进行瘦身是一件很有必要且收益很大的事情.apk ...

  4. android apk包大小优化详解

    1.使用开发工具 android studio Build > Analyz APK 2.文件说明 assets:存放一些配置文件 res:资源文件,图片.字符串.xml等 classes.de ...

  5. 在英特尔架构服务器上构建基于矢量包处理(VPP)的快速网络协议栈

    在英特尔®架构服务器上使用矢量包处理(VPP)构建快速的网络栈 Build a Fast Network Stack with Vector Packet Processing (VPP) on an ...

  6. App Thinning(为什么苹果app上传时的包比在appStore下载下来的包大很多)

    主要参考博客: App Thinning 文章目录 正式版 1. xx.xcarchive文件大小和目录,大小为389.5MB 2.选App Store Connect后Export出的文件,.ipa ...

  7. Php传图缩图,使用以下用于上传图像的PHP代码上传时缩小图像大小

    当然,它工作正常.我在PHP中使用这个类: function thumbnail( $img, $source, $dest, $maxw, $maxh ) { $jpg = $source.$img ...

  8. 设置Laber上传时注意字体大小要统一,不然不生效

  9. U3D包大小优化之microlib

    当迩想把最小类库发上来,迩需要把Stripping Level设置为Use micro mscorlib 这里是MICROLIB所能使用的包的类库列表:http://docs.unity3d.com/ ...

最新文章

  1. CSS Modules
  2. InnoDB 存储引擎体系架构
  3. Java开发程序员最值得学习的10大技术
  4. Django删除多对多表关系 :
  5. 让安全威胁无所遁形,全方位掌握攻击“前世今生”的黑科技来了
  6. torch.cuda.is_available(),torch.cuda.device_count(),torch.cuda.get_device_name(0)
  7. JavaScript OO不XX 学习总结
  8. 【DS3231 RTC实时时钟模块与Arduino接口构建数字时钟】
  9. DDoS是什么意思?
  10. 我国支付结算体系概况
  11. 美团点评 2019校园招聘 后台开发方向
  12. suse linux 光盘安装教程,suse11一键安装光盘制作
  13. 指数函数曲线拟合问题c语言,求助用指数函数拟合一组数据
  14. win7下搭载ubuntu双系统,独立引导
  15. cncert网络安全周报35期 境内被植入后门的政府网站112个 环比上涨24.4%
  16. 【点云3D目标检测】OpenPCDet下Spconv1.x与Spconv2.x的安装问题及解决方法
  17. Ubuntu常用软件安装与问题解决(持续更新)
  18. 解决ps默认打开显卡的设置
  19. 无公网服务器(ip)做内网穿透
  20. TestNG修改reportNG输出description

热门文章

  1. HTML5API(2)
  2. hdu 2065DP
  3. Erlang里实现MapReduce
  4. IDEA中引用不到HttpServlet的解决方案
  5. Python traceback 模块, 打印异常信息
  6. adb devices unauthorized解决方法
  7. requests安装及问题解决
  8. 如何正确强制执行Git推送?
  9. CSS上下左右居中的几种方法
  10. Mysqldump备份说明及数据库备份脚本分享-运维笔记