一个按钮点一下,就可以build出整个app;xcodebuild一行命令,就可以产生一个app;在这个过程中,具体做了什么了?我们可以瞟一眼看看。
1. 编译的过程是什么?
如果又是 编译 -> 汇编 -> 链接 这个,不免感到有点无聊,我们可以从一个编译的实例日志来看看,具体有什么。我们做一个demo的工程,进行一次编译


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

我们会编译 pod库 -> target依赖 -> 主target,这个流程比较明确,对于具体每一个步骤,也是比较清楚的。这篇文章不打算去深入到每一步骤的细节里,比如调用clang编译一个 oc 文件的详细过程,想说明的是在Xcode build这过程中,大致做了哪些事,用到了哪些工具,从开始n多个文件到最后一个xxx.app的过程。
2. 编译的流程在哪里定义?
通过对编译日志进行解析,我们基本明白发现了编译的过程大致每一步做了什么,用到了哪些工具,到最后 xxx.app的产出
接着,我们可以看看这个流程是在哪里定义的。

嗯,比较显然,是在 Build Phase这块定义的;
我们可以详细看看
"Target Dependencies" 这一步,显然是首先编译依赖的target
"Check Pods Manifest.lock" 这一步,是cocoapods生成的脚本,diff了下 Podfile.lock和 Manifest.lock

"Compile Sources" 没得说,这里定义了要编译的全部源码

"Link Binary With Libraries" 这里是把我们上一步编译,还有之前pod生成的静态库,动态库,都链接起来

"Copy Bundle Resources" 这块把静态的资源文件拷贝到app bundle中

"Run Script" 又是执行一个脚本文件,我们打开看看,是fabric生成的一个脚本,上传Dsyms文件用的

看到这里,其实我们应该已经比较熟悉这个流程了;这里既然Cocoapods, Fabric这些都可以生成自定义的脚本,那我们自己可以吗?当然可以了。
比如我们需要确认某次包是对应 commit id所处,我们可以动态解析当前head指针,写入Info.plist,最后编译查找问题。
3. 编译的参数选项设置
我们知道,每一步过程中,必然对应的很多的不同选项;这些参数怎么配置?

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里面,一切似乎一目了然了。

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