Xcode 构建速度优化(三)Cocoapods-Binary

在讨论什么是Cocoapods-binary之前,先上一张目前demo项目的编译分析图


image.png

其中在target demo之下的target均为Pod中的target, 从图上可以看出,在项目全量编译阶段也需要编译pod中的target, 对于一个集成几十乃至上百个第三方的项目而言,这个时间也会累计到一定量级。
如果能提前将Pod中的开源库都提前编译好,在后续省去这一步操作,对于提高项目的整体编译速度会有很大收益。

pod二进制化

pod二进制化指的是通过编译把pod中的第三方库源码转换成静态库或动态库,从而提高App项目中的编译速度。对比完整编译源码,二进制化的三方库省去了编译阶段,直接进行链接

cocoapods-binary

cocoapods-binary是Cocoapods官方推荐的一个插件,主要是来将Podfile里所依赖的组件选择性打包成二级制的一个插件,使用非常简单,通过修改Podfile文件里的内容即可

安装

gem install cocoapods-binary

如果遇到报错:

Error loading RubyGems plugin ....

image.png

可以通过更新ruby命令解决

rvm install ruby-2.6

使用

修改Podfile

platform :ios, '9.0'
use_frameworks!
# all_binary!
target 'Demo_Target' do
  
   pod 'YYKit', :binary => true
   
   pod 'AFNetworking', '~> 4.0', :subspecs => ['Reachability', 'Serialization', 'Security', 'NSURLSession'], :binary => true
   
   pod 'SDWebImage', '~> 5.0.0', :binary => true
   
   pod 'MJRefresh'
   #pod 'MBProgressHUD'
   pod 'IQKeyboardManager', :binary => true

在开始位置引入插件cocoapods-binary
在需要二进制化的库后面添加: :binary => true
如果全部库均需要二进制化, 直接在起始位置使用all_binary!, 这样默认所有库均提前编译,相当于默认开启二值化选项
在使用all_binary!情况下,如果有些库不需要开启二进制化,可以在后面添加:binary => false

成果

在将大部分库均转成二进制后, demo的全量编译速度平均提升了二十秒左右,从编译分析图上也可以看出整体趋势


image.png

在一次全量编译中三方库的整体用时相比之前少了很多

注意事项

    1. 二进制化后无法在看到开源库的内部实现
    1. 需要注意Pod二进制污染: 即部分库的实现修改了,而其他引用到该库的关联库因为并不知道这个修改, 还在使用之前遗留的引用,可能会导致出现Bug, 比如库B之前调用了库A的run方法,但是库A经过了一次迭代,删除了run方法,如果没有从新编译一次库B, 那么它在项目编译阶段并不会有报错和提示,但是真正调用run方法时候,会直接异常

你可能感兴趣的:(Xcode 构建速度优化(三)Cocoapods-Binary)