作家
登录

iOS编译过程的原理和应用

作者: 来源: 2017-04-11 09:44:33 阅读 我要评论

个中:[CP]开首的,就是CocoaPod插入的脚本。

  • Check Pods Manifest.lock,用来检查cocoapod治理的三方库是否须要更新
  • Embed Pods Framework,运行脚本来链接三方库的静态/动态库
  • Copy Pods Resources,运行脚本来拷贝三方库的资本文件

而这些设备信息都存储在这个文件(.xcodeprog)里 

到这里,CocoaPod的道理也就大年夜致搞清跋扈了,经由过程修改xcodeproject,然后设备编译期脚本,来包管三方库可以或许精确的编译连接。

同样,我们也可以插入本身的脚本,来做一些额外的工作。比如,每次进行archive的时刻,我们都必须手动调剂target的build版本,如不雅一不当心,就会忘记。这个过程,我们可以经由过程插入脚本主动化。

Object files

这段脚本其实很简单,攫取当前pist的build版本号,然后对其加一,从新写入。

应用起来也很简单:

  • Xcode – 选中Target – 选中build phase
  • 选择添加Run Script Phase   

然后把这段脚本拷贝进去,并且勾选Run Script>

脚本编译打包

脚本化编译打包对于CI(持续集成)来说,十分有效。iOS开辟中,编译打包必备的两个敕令是:

不管是OC照样Swift,都是采取Clang作为编译器前端,LLVM(Low level vritual machine)作为编译器后端。所以简单的编译过程如图  

  1. //编译成.app 
  2. xcodebuild  -workspace $projectName.xcworkspace -scheme $projectName  -configuration $buildConfig clean build SYMROOT=$buildAppToDir 
  3. //打包 
  4. xcrun -sdk iphoneos PackageApplication -v $appDir/$projectName.app -o $appDir/$ipaName.ipa 
  5.   
  6. 经由过程info敕令,可以查看到具体的文档 
  7. info xcodebuild  

在本文最后的附录中,供给了我之前应用的一个主动打包的脚本。

进步项目编译速度

查看编译时光

我们须要一个门路,可以或许看到编译的时光,如许才能有个比较,知道我们的优化毕竟有没有效不雅。

插入脚本

对于XCode 8,封闭XCode,终端输入以下指令

  1. $ defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES 

二进制文件的内容

然后,重启XCode,然后编译,你会在这里看到编译时光。  

代码层面的优化

forward declaration

所谓forward declaration,就是@class CLASSNAME,而不是#import CLASSNAME.h。如许,编译器能大年夜大年夜进步#import的调换速度。

对常用的对象类进行打包(Framework/.a)

打包成Framework或者静态库,如许编译的时刻这部分代码就不须要从新编译了。

常用头文件放到预编译文件里

XCode的pch文件是预编译文件,这里的内容在履行XCode build之前就已经被预编译,并且惹人到每一个.m文件里了。

然后,拖动这个脚本的到Link Binary With Libraries下面  

编译器选项优化

Debug模式下,不生成dsym文件

上文提到了,dysm文件里存储了调试信息,在Debug模式下,我们可以借助XCode和LLDB进行调试。所以,不须要生成额外的dsym文件来降低编译速度。

  1. #pragma clang diagnostic push 
  2. #pragma clang diagnostic ignored "-Wundeclared-selector" 
  3. ///代码 
  4. #pragma clang diagnostic pop  

Debug开启Build Active Architecture>

放在声明分号“;”前面。

后续

  1. buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}"
  2. buildNumber=$(($buildNumber + 1)) 
  3. /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

      推荐阅读

      在Node.js中看JavaScript的引用

    早期进修 Node.js 的时刻 (2011-2012),有挺多是大年夜 PHP 转过来的,当时有部分人对于 Node.js 编辑完代码须要重启一下表示麻烦(PHP不须要这个过程),于是社区里的同伙就开端倡导应用 >>>详细阅读


    本文标题:iOS编译过程的原理和应用

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

关键词: 探索发现

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

网友点评
自媒体专栏

评论

热度

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