一、概述
经过多年的发展,美柚iOS项目代码已经达到40W行+的规模,所使用的 Pod 库的数量达到了110+,App Store 安装包210M+,在这么大的项目规模下(CI机器 MAC配置:3 GHz 8-Core Intel Xeon E5;时间:发布20min+),(开发机器iMac :Retina 5K, 27-inch, 2017 融合硬盘;时间:build30min+)打包、编译问题逐步成为我们团队一个躲不过的痛,严重影响了我们的研发效率与其他团队之间的协作。
我们一台13年的ci机器同时需要承接七八个项目、多个分支的打包任务,在有多个项目同时打包的情况,显得尤其地力不从心。
在硬件资源有限的情况下,并且在无侵入、无影响现有的业务
的前提下,如何解决这些摆在团队面前的难题,便成了我们迫在眉睫的迫切需求,最近半年多来一直在寻找加快打包速度的方案。
二、编译提速探索与尝试
1、CCache
CCache 是一个编译缓存器,一个能够把编译的中间产物缓存起来的工具
其原理是通过把项目的源文件用ccache
编译器编译,然后缓存编译生成的信息,从而在下一次编译时,利用这个缓存加快编译的速度,目前支持的语言有:C
、C++
、Objective-C
、Objective-C++
下面这张图基本就阐述了CCache的工作原理。
在项目中的实际编译流程
Ccache我们经过在工程的一番尝试、确实在某些方面上极大的提升了我们出包的速度。美柚iOS Ci打包从之前的最快20min+
出包到最快10min
,确实能够给我们带来比较不错的提升,大大加快了我们项目的出包速度。在我们项目运行了几个月后,对于我们项目的情况,也发现了一些问题,现在总结了以下几点:
优点:
- 满足我们追求的无侵入、无影响现有的业务的要求,无入侵、且开发人员无感知。
- 确实能大幅度地提升编译速度,美柚项目上最快时提高3倍以上的编译速度。
- 不需要对项目作出大调整,只需部署相关环境和一些脚本支持。
- 不需要改变开发工具链。
- 同一个目录下,CCache 的缓存命中率相对稳定。
对我们项目中有存在些问题点:
- 在未有缓存的情况下,首次打包编译的时间比原来的翻近一倍,原来20+min,首次将近40+min,在资源紧张的情况下,甚至是70min+。
- 修改一些引用较多的文件(如公共库、底层库改动),容易造成大范围的缓存失效,速度会变得比原来未使用ccache时更慢。
- 多个项目相同的组件不支持缓存共享,我们有多个分支打包的需求,修改目录名称后,缓存即失效。
- 我们机器的Ccache最大的缓存上限约18GB,且Debug/Release区别缓存,美