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

2020-11-03  本文已影响0人  iOS开发面试总结

原文作者:Mr_Coder
原文链接:https://juejin.im/post/6890419459639476237

Github开源,附详细使用教程

一,概述

距离上一篇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项目组件二进制化:

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

四,快速二进制化实现简介

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

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

image

图四

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

五,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,一般不做选定。

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

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

解决:在标题搜索路径中添加对应的文件引用

4,命令PhaseScriptExecution失败,退出代码非零
image

解决: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、逆向、底层面试题整合文档等免费资料!!!
上一篇下一篇

猜你喜欢

热点阅读