美文网首页
XCode加速编译最佳实践

XCode加速编译最佳实践

作者: Yi小祥 | 来源:发表于2019-03-16 16:35 被阅读0次

前言:近期对XCode加速编译做了一些研究,对网上的加快XCode编译速度的方法进行了总结,同时自己也举一反三写了个脚本优化提速,我想这篇文章应该是你看到的最全的XCode加速编译的解决方案。

0x00 将Debug Information Format改为DWARF

在project相应Target的Build Settings中,找到Debug Information Format这一项,将Debug时的DWARF with dSYM file改为DWARF。

设置DWARF

注意:dSYM文件是保存16进制函数地址映射信息的中转文件,我们调试的 symbols 都会包含在这个文件中,如果你在调试过程中发现函数堆栈无法显示,或者你需要使用Profile工具分析app,你可能需要重新开启Debug为DWARF with dSYM file。

0x01 将Build Active Architecture Only改为Yes

在project相应Target的Build Settings中,找到Build Active Architecture Only这一项,将Debug时的No改为Yes。

将Build Active Architecture Only改为Yes

这一项设置的是是否仅编译当前架构的版本号,假设为No,会编译全部架构的版本号。须要注意的是,此选项在Release模式下必须为No。否则公布的ipa在部分设备上将不能执行。

0x02 增加XCode执行的线程数

可以根据自己Mac的性能,更改线程数设置5:

defaults write com.apple.Xcode PBXNumberOfParallelBuildSubtasks 5

另外也有一个设置可以开启:

defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES

XCode默认使用与CPU核数相同的线程来进行编译,但由于编译过程中的IO操作往往比CPU运算要多,因此适当的提升线程数可以在一定程度上加快编译速度。

至此,你可能觉得与网上搜到的有关XCode加速编译的文章并无不同,不过,精彩的往往在后面,下面让我隆重介绍一个独特的方案:

0x03 优化Copy Pod Resources

如果你的项目使用了CocoaPod,并且项目中使用CocoaPod引用了很多第三方库,以及公司项目也是以组件的形式通过CocoaPod进行组件化拆分。那么你一定会遇到和我一样的问题,那就是Copy Pod Resources花费大量的时间:


Copy Pod Resources花费时间

上图是一个中等大小的项目,可以看到Build的时间总共耗时42.5s,而Copy Pod Resources却花费了34.3s,可见优化Copy Pods Resources带来的收益是相当可观的。

我们知道Copy Pods Resources是用于将pod库中的资源文件拷贝到app目录下,因此如果文件越多越大,耗时自然就越长。更重要的是,Pod下的资源文件,通常情况下,在我们pod update后,不会发生改变,如果每次Build都去copy,实属浪费。因此我的解决方案是:

仅在pod update后,Build才进行copy resources操作,避免每次Build都去copy

要达到此目的,你仅需要如下两步操作:

  1. 在工程的根目录下创建文件copy_pod_resources_once.patch并填入以下代码:
set -e

# Add This To Copy Resource only once
NONCE_FILE="${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/../copyresources-done-#Time#.nonce"
if [ -f "$NONCE_FILE" ]; then
    printf "$NONCE_FILE \n"
    printf "already copied resources"
    exit 0
else
    touch "$NONCE_FILE"
fi

  1. 在podfile中加入如下代码,其中你需要把YourProjectName替换为你自己的工程名:
post_install do |installer|
    copy_pods_resources_path = "Pods/Target Support Files/Pods-YourProjectName/Pods-YourProjectName-resources.sh"
    text = File.read(copy_pods_resources_path)
    string_onceCopy = File.read("copy_pod_resources_once.patch")
    string_time = Time.now.strftime("%Y%m%d%H%M%S")
    string_onceCopy = string_onceCopy.gsub("#Time#", string_time)
    text = text.gsub("set -e", string_onceCopy)
    File.open(copy_pods_resources_path, "w") {|file| file.puts text}
end

重新pod update后,第一次Build时间不变,第二次Build的时间会大幅缩短:


优化Copy Pods Resources后

上述方法是我参考这里举一反三得到的升级版,各位看官有兴趣不妨一试,如有问题欢迎私信或留言。当然你也可以使用如下配置达到类似效果:

设置Copy Pods Resources
不过,这个设置需要在之前已经Build成功后再勾选上,否则会出现资源没有Copy导致的app资源丢失,也有可能出现崩溃。

0x04 使用CCache

CCache的原理是通过把项目的源文件用ccache编译器编译,然后缓存编译生成的信息,从而在下一次编译时,利用这个缓存加快编译的速度,目前支持的语言有:C、C++、Objective-C、Objective-C++,但是如果找不到ccache编译器,那么还是会选择clang编译器来编译源文件。
CCache的使用方法这里不再赘述,配置有些许麻烦,但是如果你的项目代码量较大,效果还是很显著的,您可以参考这边文章: ccache - 让Xcode编译速度飞起来

上述的每一个方法或多或少都会带来副作用,大家在使用时需要根据项目的实际情况酌情选择,最后对上述所有方法做一个汇总:

方案 原理 加速效果 使用场景
将Debug Information Format改为DWARF 修改XCode配置,不生成dSYM文件 ✨✨✨ 所有
将Build Active Architecture Only改为Yes 修改XCode配置,仅编译当前架构 ✨✨ 所有
增加XCode执行的线程数 修改XCode配置,利用CPU多核 所有
优化Copy Pod Resources 针对资源,优化Copy Pods Resources ✨✨✨✨ pod库资源文件较多、较大
使用CCache 针对代码,缓存编译信息 ✨✨✨✨ 源文件较多

相关文章

网友评论

      本文标题:XCode加速编译最佳实践

      本文链接:https://www.haomeiwen.com/subject/jqxsmqtx.html