Xcode Build过程

一个按钮点一下,就可以build出整个app;xcodebuild一行命令,就可以产生一个app;在这个过程中,具体做了什么了?我们可以瞟一眼看看。

1. 编译的过程是什么?

如果又是 编译 -> 汇编 -> 链接 这个,不免感到有点无聊,我们可以从一个编译的实例日志来看看,具体有什么。我们做一个demo的工程,进行一次编译

image.png

image.png

这个流程看起来还是比较明确的,做一个流程图表示的话,就是这样


image.png

我们会编译 pod库 -> target依赖 -> 主target,这个流程比较明确,对于具体每一个步骤,也是比较清楚的。这篇文章不打算去深入到每一步骤的细节里,比如调用clang编译一个 oc 文件的详细过程,想说明的是在Xcode build这过程中,大致做了哪些事,用到了哪些工具,从开始n多个文件到最后一个xxx.app的过程。

2. 编译的流程在哪里定义?

通过对编译日志进行解析,我们基本明白发现了编译的过程大致每一步做了什么,用到了哪些工具,到最后 xxx.app的产出
接着,我们可以看看这个流程是在哪里定义的。

image.png

嗯,比较显然,是在 Build Phase这块定义的;
我们可以详细看看

"Target Dependencies" 这一步,显然是首先编译依赖的target
"Check Pods Manifest.lock" 这一步,是cocoapods生成的脚本,diff了下 Podfile.lock和 Manifest.lock
image.png
"Compile Sources"  没得说,这里定义了要编译的全部源码
image.png
"Link Binary With Libraries" 这里是把我们上一步编译,还有之前pod生成的静态库,动态库,都链接起来
image.png
"Copy Bundle Resources" 这块把静态的资源文件拷贝到app bundle中
image.png
"Run Script" 又是执行一个脚本文件,我们打开看看,是fabric生成的一个脚本,上传Dsyms文件用的
image.png

看到这里,其实我们应该已经比较熟悉这个流程了;这里既然Cocoapods, Fabric这些都可以生成自定义的脚本,那我们自己可以吗?当然可以了。
比如我们需要确认某次包是对应 commit id所处,我们可以动态解析当前head指针,写入Info.plist,最后编译查找问题。

3. 编译的参数选项设置

我们知道,每一步过程中,必然对应的很多的不同选项;这些参数怎么配置?

image.png

Build Settings里面可以找到全部的配置,这里有很多很多东西。比如,有签名部分的配置,有build 优化的,等等。这里最好的参考,其实还是Xcode文档
这是链接,有每项的说明,这是最好不过了。
https://help.apple.com/xcode/mac/10.1/index.html?localePath=en.lproj#/itcaec37c2a6

4. 配置落实到文件在哪里

不管是 Xcode Build Phase,还是Xcode Build Settings,都是我们在Xcode里面看到的,落实到文件上是在哪里呢?
我们可以找到一个 project.pbxproj 的文件,我们拖进 visual studio里面,一切似乎一目了然了。

image.png

我们可以慢慢看,这里就是 过程 + 参数配置的结合体,到这里,似乎一切都明了了。
最后,多说一句,pbxproj格式文件,还真古老,最早源自 " NeXT 的 OpenStep",具体的解析可以Google更多。

你可能感兴趣的:(Xcode Build过程)