Swift编译慢?请看这里,全套开源
原文作者:Mr_Coder
原文链接:https://juejin.im/post/6890419459639476237
一,概述
距离上一篇iOS二进制编译方案(iOS如何提高10倍以上编译速度)已经快过去半年了,期间收到了很多来着小伙伴们的支持。cocoapods-imy-bin这套系统也在我司(美柚)跑满了上万条的打包记录,目前表现依然是很稳定。
鉴于目前的市场上,Swift和Swift-OC混编项目流行,并且Swift的编译项目过慢的问题,在业务发生之瑕疵,造成对Swift,Swift-OC项目的二进制组件化的支持。希望能给小伙伴们在iOS编译的问题上,提供帮助。
二,项目效果
直接进行上图看效果,多余的话就不多说了。此处实验Swift-OC-Demo地址,感兴趣的小伙伴们可以自行下载验证效果。
图一,构建任务对比
图二,建立时间对比
图一,编译任务数,在未使用\使用二进制时,编译任务是532 \ 113个,113个任务是除Pods库外的一些其他文件,链接,复制文件,sign等任务之外,减少了80%的任务。
图二,编译时间,在未使用\使用二进制时,编译时间是35.9s \ 17.8s个,17.8s是除Pods库外的一些其他文件,链接,复制文件,sign等时间,效率提升了2倍。
图三,美柚App编译时间对比
总体效率上,编译速度的提升是非常可观的,项目体积,性能提升越明显,在我司美柚APP项目上,编译提速可达13倍以上。(全量编译)
三,Cocoapods-imy-bin项目功能
自动化支持iOS项目组件二进制化:
- 无入侵,无感知,不影响现有业务,不影响现有代码框架,完全绿色产品〜
- 轻量级,只要项目能编译通过能够使用,无视组件化,无视转换
- 完全自动化,一键使用,无需手动操作
- 支持使用与不使用
use_frameworks!
- 提供几个特色服务
- 少数支持swift项目二进制化编译的开源项目之一
四,快速二进制化实现简介
OC-Demo在这,具体原理及详情请移步到iOS如何提高10倍以上编译速度。目前,Demo是Swift OC混编,同时支持纯Swift项目。
Swift二进制化原理其实也就那么那么回事,在pod的时候,全部自动转换成框架
图四
图五,自动转换依赖二进制化组件
五,Swift二进制化遇到的问题
1,使用Swift 5.1.3编译的模块不能由Swift 5.2.2编译器导入
解决:
1,配置Framework的构建设置将“构建分发库”选项设置为YES,否则Swift编译器不会生成必要的” 。swiftinterface文件,这是将来编译器能够加载旧库的关键。
2,如果机器不多的话,可以把xcode更新到统一的版本号
2,转换后的工程,在{Development Pods}下,OC引用Swift文件,找到对应的类
解决:(建议壳工程化,可以避免此问题)
这个文件是混编时,系统生成的Swift文件对应的Objective-C的头文件,具体可以在目标->构建设置-> Swift编译器-常规-> Objective-C生成的接口头名称进行配置,默认文件名是工程名-Swift.h,一般不做选定。
3,Podfile引用use_frameworks!与不引用use_frameworks!的编译问题
找不到对应的头文件,这个头文件是xcode编译时自动生成的,在产品/Debug-iphonesimulator/lottie-ios/lottie-ios.framework/Headers中,去掉** use_frameworks!**后就找不到了
解决:在标题搜索路径中添加对应的文件引用
4,命令PhaseScriptExecution失败,退出代码非零
解决:cocopods1.8.4会出现此问题,升到1.9.1后就正常了
5,,Masonry
未定义模块。要选择生成模块映射的目标(在将其构建为静态库时从Swift导入它们是必需的),可以use_modular_headers!
在Podfile中全局设置,或指定:modular_headers => true
特定的依赖项。
pod bin auto的时候出现了
解决:修改cocoapods插件相关代码,或者使用cocopods-imy-bin v0.3.11版本即可解决。
# setting modular_headers_for
if(target_definition && target_definition.use_modular_headers_hash.values.any?)
target_definition.use_modular_headers_hash.values.each do |f|
f.each { | pod_name| self.set_use_modular_headers_for_pod(pod_name, true) }
end
end
复制代码
👇推荐👇:
大家可以加入iOS技术交流群,群号:789143298 群密码:123 群内提供数据结构与算法、底层进阶、swift、逆向、底层面试题整合文档等免费资料!!!
