Swift编译慢?请看这里,全套开源

逆变磷火
• 阅读 145

一、概述

距离上一篇iOS二进制编译方案(iOS如何提高10倍以上编译速度)已经快过去半年了,期间收到了很多来着小伙伴们的支持。cocoapods-imy-bin这套系统也在我司(美柚)跑满了上万条的打包记录,目前表现依然是很稳定。

鉴于目前市场上,Swift及Swift-OC混编项目流行,且Swift的编译项目过慢的问题,在业务繁忙之瑕,做了对Swift、Swift-OC项目的二进制组件化的支持。希望能给小伙伴们在iOS编译的问题上,提供帮助。

二、项目效果

我们Cocoapods-imy-bin项目,同时支持对纯Swift、纯Object-C、Swift-OC混编的二进制化。

直接上图看效果,多余的话就不多说了。本文实验Swift-OC-Demo地址,感兴趣的小伙伴们可以自行下载验证效果。

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:413038000,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

以下资料在群文件可自行下载!

Swift编译慢?请看这里,全套开源

Swift编译慢?请看这里,全套开源

图一、Build tasks对比

Swift编译慢?请看这里,全套开源

图二、Build time对比

图一、编译任务数,在未使用\使用二进制时,编译tasks是532\113个、113个tasks是除了Pods库外的一些其他文件、link、copy文件、sign等tasks,减少了80%的tasks

图二、编译时间,在未使用\使用二进制时,编译时间是35.9s\17.8s个、17.8s是除了Pods库外的一些其他文件、link、copy文件、sign等时间,效率提升了2倍。

Swift编译慢?请看这里,全套开源

图三、美柚App 编译时间对比

总体效率上,编译速度的提升是非常可观的,项目越大、性能提升越明显,在我司美柚APP项目上,编译提速可达13倍以上。(全量编译)

三、Cocoapods-imy-bin项目功能

自动化支持iOS项目组件二进制化:

  1. 无入侵、无感知、不影响现有业务,不影响现有代码框架、完全绿色产品~
  2. 轻量级,只要项目能编译通过就能使用,无视组件化、无视耦合
  3. 完全自动化,一键使用、无需手动操作
  4. 支持 使用与不使用 use_frameworks!
  5. 提供几个特色服务
  6. 少数支持swift项目二进制化编译的开源项目之一

四、Swift二进制化实现简介

目前Demo是Swift-OC 混编,同时支持纯Swift项目。OC-Demo在这,具体原理及详情请移步到 iOS如何提高10倍以上编译速度

Swift二进制化原理其实也就那么回事,在pod的时候,全部自动转换成Framework

Swift编译慢?请看这里,全套开源

图四

Swift编译慢?请看这里,全套开源

图五、自动转换依赖二进制化组件

五、Swift二进制化遇到的问题

1、Module compiled with Swift 5.1.3 cannot be imported by the Swift 5.2.2 compiler

解决:

1、配置Framework的Build Setting将“Build Libraries for Distribution”选项设置为 YES,否则Swift编译器不会生成必要的".swiftinterface文件,这是将来编译器能够加载旧库的关键。

2、如果机器不多的话,可以把xcode更新到统一的版本号

2、转换后的工程,在{Development Pods}下,OC引用Swift文件,找不到对应的类

Swift编译慢?请看这里,全套开源

解决:(建议壳工程化,可以避免此问题)

这个文件是混编时,系统生成的Swift文件对应的Objective-C的头文件,具体可以在Targets-->Build Settings-->Swift Compiler - General-->Objective-C Generated Interface Header Name进行配置,默认文件名是工程名-Swift.h,一般不做改动。

Swift编译慢?请看这里,全套开源

3、Podfile引用 use_frameworks! 与不引用 use_frameworks!的编译问题

找不到对应的头文件,这个头文件是xcode编译时自动生成的,在Products/Debug-iphonesimulator/lottie-ios/lottie-ios.framework/Headers 中,去掉use_frameworks!后就找不到了

Swift编译慢?请看这里,全套开源

解决:在Header Search Paths 添加对应的文件引用

Swift编译慢?请看这里,全套开源

4、Command PhaseScriptExecution failed with a nonzero exit code

Swift编译慢?请看这里,全套开源

解决:cocopods1.8.4会出现此问题,升到1.9.1后就正常了

5、Masonry, which do not define modules. To opt into those targets generating module maps (which is necessary to import them from Swift when building as static libraries), you may set use_modular_headers! globally in your Podfile, or specify :modular_headers => true for particular dependencies.

pod bin auto 的时候出现了

Swift编译慢?请看这里,全套开源

解决:修改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 工程师,2019 年加入美柚。

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:413038000,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

以下资料在群文件可自行下载!

Swift编译慢?请看这里,全套开源

作者:Mr_Coder
链接:https://juejin.cn/post/6890419459639476237
来源:掘金

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
(转)直接拿来用!最火的iOS开源项目(二)
“每一次的改变总意味着新的开始。”这句话用在iOS上可谓是再合适不过的了。GitHub上的iOS开源项目数不胜数,iOS每一次的改变,总会引发iOS开源项目的演变,从iOS1.x到如今的iOS7,有的项目已经被弃用,即使曾经的它很受开发者喜爱,有的项目则继续发扬光大,新项目更是层出不穷。在本文中,我们将继续为大家介绍20个在GitHub上非常受开发者欢迎
Easter79 Easter79
3年前
Taro小程序自定义顶部导航栏
微信自带的顶部导航栏是无法支持自定义icon和增加元素的,在开发小程序的时候自带的根本满足不了需求,分享一个封装好的组件,支持自定义icon、扩展dom,适配安卓、ios、h5,全面屏。我用的是京东的Taro多端编译框架写的小程序,原生的也可以适用,用到的微信/taro的api做调整就行,实现效果如下。!在这里插入图片描述(https://i
Stella981 Stella981
3年前
PhoneGap设置Icon
参考:http://cordova.apache.org/docs/en/latest/config\_ref/images.html通过config.xml中的<icon标签来设置Icon<iconsrc"res/ios/icon.png"platform"ios"width"57"height"57"densi
Wesley13 Wesley13
3年前
VLC for iOS 编译出现的问题总结
VLC官方WIKI:https://wiki.videolan.org/VLCKit/ps:里面说的很简单,两行命令,两杯咖啡的时间,在天朝实现起来太困难。前辈的经验:http://www.cnblogs.com/zjjcy/p/3858759.htmlps:总结的很有价值,里面提到的情况都有遇到,少走了很多弯路。http://blo
Stella981 Stella981
3年前
ReactNative运行IOS在Xcode 11.0编译报错
前段时间项目时间紧张,ios端因为pod文件冲突,没有使用ios模拟器开发,今天打算搞一下这个问题。解决过程主要是如下两个步骤:首先删除项目ios目录下的Pods文件夹,然后进入项目的ios文件,执行命令podinstall,等待pod文件安装完成,重新运行模拟器即可。以为这样就完了?我真是TooYoungTooSimple。!
Stella981 Stella981
3年前
JS 苹果手机日期显示NaN问题
问题描述newDate("2019122910:30:00")在IOS下显示为NaN原因分析带的日期IOS下存在兼容问题解决方法字符串替换letdateStr"2019122910:30:00";datedateStr.repl
Easter79 Easter79
3年前
Swift Package Manager 的里程碑
作者:四娘,iOS开发,目前就职于格隆汇,对Swift和编译器相关领域感兴趣Session:https://developer.apple.com/videos/play/wwdc2020/10147/https://developer.apple.com/videos/play/wwdc2020
Wesley13 Wesley13
3年前
Mono AOT 参数
在多泛型及接口时使用MonoAOT需要使用如下编译mscorlib.dllmonoaotfull,nrgctxtrampolines8096,nimttrampolines8096,ntrampolines4048mscorlib.dllhttp://docs.xamarin.com/guides/ios/troubl
Easter79 Easter79
3年前
SwiftCommon之Dictionary字典
概述Dictionary类型是IOS开发中用的很多的一种数据类型,通过键值对来保存数据。在Swift中对应Dictionary类型,而IOS的原生库中对应的NSDictionary类,两者是可以相互转换的。SCDictionary使用extension扩展为NSDictionary增加几个常用方法。SCDictionary
Wesley13 Wesley13
3年前
IOS编译过程出现过的错误汇总
1.sending'MainViewConroller\const\_strong'toparameterofincompatibletype'<NSFileManagerDelegate错误解决方案:http://stackoverflow.com/questions/24248825/gettingawa
Stella981 Stella981
3年前
IOS开发笔记(Swift):通过ShareSDK和TYAlertController实现分享功能
  上一篇《IOS开发笔记(Swift):利用开源类库实现检测更新功能(http://my.oschina.net/realfighter/blog/704612)》中,我们简单的实现了更多功能中的检测更新功能,本篇我们继续在原有代码的基础上,实现应用的分享功能,这里我们会使用ShareSDK和TYAlertController。   Shar