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

Github开源,附详细使用教程

一、概述

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

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

二、项目效果

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

图一、Build tasks对比
图二、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倍。

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

总体效率上,编译速度的提升是非常可观的,项目越大、性能提升越明显,在我司美柚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二进制化遇到的问题

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文件,找不到对应的类
image

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

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

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

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

image

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

image
4、Command PhaseScriptExecution failed with a nonzero exit code
image

解决: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 的时候出现了

image

解决:修改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 年加入美柚。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342