在讨论什么是Cocoapods-binary之前,先上一张目前demo项目的编译分析图
其中在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 ....
可以通过更新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的全量编译速度平均提升了二十秒左右,从编译分析图上也可以看出整体趋势
在一次全量编译中三方库的整体用时相比之前少了很多
注意事项
- 二进制化后无法在看到开源库的内部实现
- 需要注意Pod二进制污染: 即部分库的实现修改了,而其他引用到该库的关联库因为并不知道这个修改, 还在使用之前遗留的引用,可能会导致出现Bug, 比如库B之前调用了库A的run方法,但是库A经过了一次迭代,删除了run方法,如果没有从新编译一次库B, 那么它在项目编译阶段并不会有报错和提示,但是真正调用run方法时候,会直接异常