iOS提升编译和打包速度(一)

CCache是可以把编译的中间产物.o,缓存起来的工具。在首次编译时,如果工程中配置了CCache,就会把CCache作为C编译器,同时,编译生成的目标文件进行缓存,在下一次编译时,会使用缓存的.o目标文件。

  • 安装ccache工具
//打开终端执行 如下命令  HomeBrew可能 更新的时间 会比较长
brew install ccache
//安装完毕查看

ccache --help //查看可以使用的命令行

ccache -V   //当前安装的版本
  • 创建ccache编译的脚本
cd 工程目录  //进入工程目录
touch ccache-clang  //创建一个ccache-clang空白文件

打开编辑ccache-clang文件,把如下内存复制进去 

#!/bin/sh
export PATH=$PATH:/usr/local/bin
export CCACHE_MAXSIZE=10G
export CCACHE_CPP2=true
export CCACHE_HARDLINK=true
export CCACHE_SLOPPINESS=file_macro,time_macros,include_file_mtime,include_file_ctime,file_stat_matches

  # 指定日志文件路径到桌面,等下排查集成问题有用,集成成功后删除,否则很占磁盘空间
export CCACHE_LOGFILE=~/Desktop/CCache.log
exec ccache /usr/bin/clang "$@"

修改文件的读写权限

  • $ chmod 777 ccache-clang //最大权限 所有人 可读可写
  • ccache-clang++脚本

  如果你的代码或者是第三方库的代码用到了C++,用同样的方法创建一个ccache-clang++。相应的对clang的调用也要改成clang++,否则 CCache 不会应用在 C++ 的代码上。

#!/bin/sh
export PATH=$PATH:/usr/local/bin
export CCACHE_MAXSIZE=10G
export CCACHE_CPP2=true
export CCACHE_HARDLINK=true
export CCACHE_SLOPPINESS=file_macro,time_macros,include_file_mtime,include_file_ctime,file_stat_matches

  # 指定日志文件路径到桌面,等下排查集成问题有用,集成成功后删除,否则很占磁盘空间
export CCACHE_LOGFILE=~/Desktop/CCache.log
exec ccache /usr/bin/clang "$@"

在工程中的目录如下:

  • 修改工程配置  定义CC常量

在你项目的构建设置(Build Settings)中,添加一个常量CC,这个值会让 Xcode 在编译时把执行路径的可执行文件当做 C 编译器。CC常量的值为 $(SRCROOT)/ccache-clang,如果你的脚本不是放在项目根目录,则自行调整路径。如果一运行项目就报错,检查下路径是不是填错了。

关闭 Clang Modules

因为 CCache 不支持 Clang Modules,所以需要把 Enable Modules 的选项关掉。这个问题在 CocoaPods 上如何处理,后面会讲。
   关闭了 Enable Modules 后需要作出的调整因为关闭了 Enable Modules,所以必须删除所有的 @import语句,替换为#import的语法例如将 @import UIKit 替换为 #import <UIKit/UIKit.h>。之后,如果你用到了其他的系统框架例如 AVFoundation、CoreLocation等,现在 Xcode 不会再帮你自动引入了,你得要在项目 Target 的 Build Phrase -> Link Binary With Libraries 里面自己手动引入。

如果你的工程是使用cocoapods管理的,任务还没有完成

因为 CocoaPods 会单独把第三方库打包成一个 Static Library(或者是Dynamic Framework,如果用了 use_frameworks!选项),所以 CocoaPods 生成的 Static Library 也需要把 Enable Modules 选项给关掉。但是因为 CocoaPods 每次执行 pod update 的时候都会把 Pods 项目重新生成一遍,如果直接在 Xcode 里面修改 Pods 项目里面的 Enable Modules 选项,下次执行pod update的时候又会被改回来。我们需要在 Podfile 里面加入下面的代码,让生成的项目关闭 Enable Modules 选项,同时加入 CC 参数,否则 pod 在编译的时候就无法使用 CCache 加速。

post_install do |installer_representation|
    installer_representation.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            #关闭 Enable Modules
            config.build_settings['CLANG_ENABLE_MODULES'] = 'NO'
            
            # 在生成的 Pods 项目文件中加入 CC 参数,路径的值根据你自己的项目来修改
            config.build_settings['CC'] = '$(PODS_ROOT)/ccache-clang'
        end
    end
end

需要注意的是,如果你使用的某个 Pod 引用了系统框架,例如AFNetworking引用了System Configuration,你需要在你自己项目的Build Phrase -> Link Binary With Libraries里面代为引入,否则你编译时可能会收到 Undefined symbols xxx for architecture yyy一类的错误。有点回到了原始时代的感觉,但考虑到编译速度的极大提升,这一点代价可以接受。
可能需要重新引入的库

例如:SDWebImage在编译运行时,会报很多的错误,但是,根据错误查找所需要依赖的系统库,如下,添加方式也如下。

 到此为止,无论是.xcodeproj,还是.xcworkspace的项目,配置都已经完成了,command +B,编译两次,然后终端执行ccache -s查看缓存情况.

cache size  缓存的文件大小

cache hit rate 使用缓存率

cache miss 未使用缓存的数量

files in cache 缓存的文件总数

 学习博客:

https://blog.csdn.net/icefishlily/article/details/80267223

https://www.jianshu.com/p/b61f182f75d2

https://www.jianshu.com/p/7286396f8838

https://www.jianshu.com/p/94bf49a8ff3e

http://codingpub.github.io/2019/09/08/提升iOS打包速度/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值