命令编译工程源码-幸福中C端iOS编译优化实践——40%优化持续

背景

经过多年的业务迭代,C端项目的增量编译已经严重恶化。 2021年12月之前,C端平均增量编译将持续3分钟以上,严重影响开发效率,急需优化! 优化后,增量编译时间提升至2分钟左右。

分析Happiness中的app编译过程

主要历时分析

解决方案 LLVM编译优化 LLVM编译流程

.m文件编译从.o文件开始依次经历以下阶段:

可以看到,从源文件编译到目标文件的过程中,做了很多工作。 如果在源文件中添加一行新的代码,那么所有开发者朋友在构建时都必须再次走一遍这一步,减少了很多重复。

海豚分布式编译缓存

命令编译工程源码-幸福中C端iOS编译优化实践——40%优化持续

byte appinfra 团队使用 hookLLVMClang 根据内容和依赖项将基本编译命令(例如 oc 文件)哈希为唯一密钥。 编译完新的.m后,我们将对应的.o和key分别存储在本地硬盘和远程服务器上,其他开发者编译时只需要下载.o文件即可,这样可以大大提高编译效率。 幸福中的CI接入海豚后,打包编译部分从600s增加到240s。

资源优化

每次编译时都会将主要项目资源编译到Assets.car中。 主项目的资源下存放着项目中的很多图片。 这一步每次编译都会花费30+s,因此将主工程的大部分Image资源迁移到pod库中,这样可以将主工程资源的编译时间提高到5s以内。

我们的项目使用资源来引用资源。 这一步是将所有pod库的资源复制并编译合并到主项目的Assets.car中,大约需要40s。 优化有两个方向:

如果改成resource_bundles,每个pod都有自己的bundle和自己的Assets.car,不需要每次都编译。 增量编译的步数将减少到0,项目重构的成本巨大,可以作为Perennial的目标去做。

如果我们不需要careUI接口,比如做埋点的时候,我们可以编写脚本在编译时选择跳过这一步,短期内就可以实现。

链接优化ld64

ld64工作原理参考:

静态链接器ld64负责分析编译器和其他模块输出的.o、.a和.dylib,并通过解析、重定向和聚合符号来组装可执行文件。 ld64的主要工作流程如下:

兹勒德

zld是基于ld64开发的链接器的优化版本。 它减少了并发数并使用更快的数据结构来优化链接过程。 其实我们也可以参与zld的优化。 例如,飞书中的鳄鱼通过地图搜索来优化线性搜索。 增加算法时间复杂度可以优化符号解析的持续时间。

线性搜索

地图搜索

访问zld数据对比

ld64 数据:

zld数据:

推理

数据对比:

优化前:3.79m

优化后:1.91m

命令编译工程源码-幸福中C端iOS编译优化实践——40%优化持续

实用方法资源副本

项目podinstall时,会在pods-target-resources中生成资源复制脚本代码,编译时会运行该脚本。 如果想跳过资源复制,直接在资源第一行添加exit0即可。

调试工具

zld源代码:

使用zld编译项目,查看编译日志,获取链接命令代码:

把括号和上面的东西删掉命令编译工程源码,clang命令后面加个-v,可以显示链接参数,然后执行脚本,生成链接参数,把-demangle前面的东西复制删除,保存到juzi.txt :

-demangle -lto_library /Applications/Xcode.app/Content......

打开zld项目,调整编译模式为release(debug运行太慢,release运行快且无法断点调试),将juzi.txt的参数复制到arguments中,即可直接调试项目的链接过程。

分析 zld 持续时间

将zld项目运行的release版本的可执行文件复制到桌面。

打开xcode的instruments的timeprofiler,选择桌面上的zld可执行文件。

将juzi.txt参数中的s-替换为\n-,并复制到上图的arguments中,然后运行分析。

-demangle 
-lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib 
-dynamic 
...

如图所示,getUserVisibleName()耗时较长,我们查看一下zld的源码

经过断点或者日志测试,发现这个方法始终找不到“.llvm”的子串。 (仅作为demo测试),所以尝试改成如下代码:

再次编译形成新的可执行文件,通过仪器重新测试后得到如下数据:

去做

将资源更改为resource_bundles,并将资源复制时长减少为0。

项目中使用Swift的越来越多,可以为Swift连接dolphin的编译缓存。

探索lld行业动态,进一步优化链接速度。

参考

%E6%B7%B1%E5%85%A5%E5%89%96%E6%9E%90-iOS-%E7%BC%96%E8%AF%91-Clang---LLVM

加入我们

字节地产部2023年校园客户端岗位紧急招聘! 感兴趣的朋友联系:xubinbin.19971226@bytedance.com

幸福是一个集内容、社区、工具于一体的房地产信息与服务平台。 产品基于个性化推荐引擎,向用户推荐优质房产内容和全面真实的房源信息,旨在为用户提供全面、专业、可靠的购房支持。

上海:

广州:

住小帮是一个真实可靠的一站式家居服务平台。 整合大量真实家居案例、实用易懂的家居知识、精挑细选的家居服务命令编译工程源码,陪伴家居装修全过程,让您轻松实现理想家园。

上海:

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 命令编译工程源码-幸福中C端iOS编译优化实践——40%优化持续 https://www.wkzy.net/game/174924.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务