作家
登录

如何将iOS项目的编译速度提高5倍

作者: 来源: 2017-10-20 11:05:25 阅读 我要评论

沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散!


媒介

贝聊今朝开辟的两款App分别是贝聊家长版和贝聊师长教师版,比来因为在快速迭代开辟新功能,项目范围急速增长,单个端营业代码约23万行,私有库约6万行,第三方库代码约15万行,单个客户端的代码行数约60万。如今打包一次耗时须要11~12分钟。固然还远远比不上 Facebook 的40分钟,然则我们在内测的时刻,经常一天要宣布内测版两到三次。打包时CPU占用根本上是百分百的,因为没有专门的 CI 机械,对负粜ヲ包的同事(其实就是我本身)的工作时光┞芳用比较多,所以比来一向在寻找加快打包速度的筹划。

今朝的项目架构

我们的项目应用 CocoaPods 来治理第三方库和私有库的依附,对大年夜部分项目来说应当是标配了。今朝照样纯 Objective-C 的项目,没有惹人 Swift。

调研过的筹划

下面列出我研究过的一些主流筹划以及我最后没有采取的原因,这些筹划有各自的局限性,然则也给了我不少启发,思虑过程跟最终计整洁样有价值。

cocoapods-packager

cocoapods-packager 可以将随便率性的 pod 打包成 Static Library,省去反复编译的时光,必定程度上可以加快编译时光,然则也有自身的缺点:

  1. 优化不彻底,只能优化第三方和私有 Pod 的编译速度,对于其他修改频繁的营业代码力所不及
  2. 私有库和第三方库的后续更新很麻烦,当有源码修改后,须要从新打包上传到内部的 Git 仓库
  3. 过多的二进制文件会拖慢 Git 的操作速度(今朝还没安排 Git 的 LFS)
  4. 难声调试源码

这个筹划跟 cocoapods-packager 比较类似,优缺点都差不多,但 Carthage 可以比较便利地调试源码。因为我们今朝已经大年夜范围应用 CocoaPods,转用 Carthage 来做担保理须要做大年夜量的转换工作,所以不推敲这个筹划了。

Buck

Buck 是一套通用的构建体系,由 Facebook 开源。最大年夜的特点是智能的增量编译可以极大年夜地进步构建速度。最早据说 Buck 的时刻,它还只能用在安卓上,如今已经适配了 iOS。

Buck 是个相当完全的解决筹划,很多国外的大年夜公司例如 Uber 都已经用上。我也花了很多时光来研究,最终照样认为对我们的项目和团队来说,今朝并不是很合适,重要原因是:

  1. Buck 摈弃了 Xcode 的项目文件,须要手工编写设备文件来指定编译规矩,这要对现有项目作出大年夜幅度的调剂。我们今朝还在快速迭代新功能,没有余暇和人手来实施。
  2. 开辟和调试的流程都得做出很大年夜的改变。因为 Buck 接收了项目编译的过程,想调试项目不克不及简单地在 Xcode 琅绫擎 ?+R 了,得先反过来让 Buck 生成 Xcode 的项目文件。Uber 的工程师甚至推荐应用 Nuclide 来代替 Xcode 作为开辟情况。固然道理上是可行的,然则团队须要花不少时光来适应,短期内效力降低无可避免。
  3. 用 Xcode 底时菌码享受不到加快编译速度的好处。固然可以用 buck 敕令启动 App,然后在敕令行里启动 lldb 来调试,但那就无法应用 Xcode 的调试对象 例如 View Debugging 和 Memory Graph Debugger。

Bazel

先来看看我对于解决筹划的诉求:

  1. 能大年夜幅度地晋升编译速度,起码要削减掉落 50% 的编译时光
  2. 不须要对项目作稳重大年夜调剂
  3. 不须要改变开辟对象链

Bazel 跟 Buck 很类似,是 Google 开源的,优缺点跟 Buck 都差不多,不再具体说了。

distcc 分布式编译

道理是把一部分须要编译的文件发送到办事器上,办事器编译完成后把编译产品传回来。我测验测验了一下比较出名的 distcc,搭建过程比较简单,最后也能成功地把编译义务分派到内网的多台办事器上。然则其他编译办事器的 CPU 占用老是很低,只有 20% 阁下;也就是说分派义务的速度甚至还赶不上办事器编译的速度,分派义务然后回传编译产品这个过程所消费的时光跨越了本地直接编译。一向调剂参数反复实验了很多次,最后发明编译时光完全没有变快,甚至还有点变慢了。可能以我们今朝衔目标范围并不合适应用分布式编译。

最终筹划:CCache

CCache 是一个可以或许把编译的中心产品缓存起来的对象,在其他范畴已经有不少应用,只是在 iOS 界的实践比较少。经由我的实践,它可以或许知足我前面的三点请求。我最早熟悉到它是搜到了这篇文┞仿:Using ccache for Fun and Profit | Inside PSPDFKit

如不雅你不应用 CocoaPods,参照膳绫擎的文┞仿即可。因为针对 CocoaPods 须要作出一些额外的调剂,所以照样解释一下。下面就来说说要如何把 CCache 应用在用 CocoaPods 作为担保理对象的 iOS 项目中。

安装步调:

留意:项目路径不克不及有中文,不然会影响 CCache 的┞俘常工作

安装 CCache

起首你须要在电脑上安装 Homebrew,对应用 macOS 的法度榜样员来说应当是标配,略过。

若何将iOS项目标编译速度进步5倍

经由过程 Homebrew 安装 CCache, 在敕令行中履行

  1. $ brew install ccache 

敕令跑完后即安装成功。

创建 CCache 编译脚本

为了能让 CCache 介入到全部编译的过程,我们要把 CCache 作为项目标 C 编译器,当 CCache 找不到编译缓存时,它会再把编译指令传递给真正的编译器 clang。

新建一个文件定名为ccache-clang, 内容为下面这段脚本,放到你的项目里

ccache-clang

 1/4    1 2 3 4 下一页 尾页

  推荐阅读

  化敌为友,Docker 宣布拥抱 Kubernetes

沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散! 在当前企业改变传统的单体应用,拥抱更灵活的、应用容器的云原生 DevOps 模型的大年夜潮之下,Docker 具有先>>>详细阅读


本文标题:如何将iOS项目的编译速度提高5倍

地址:http://www.17bianji.com/lsqh/38068.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)