背景
经过多年的业务迭代,C端项目的增量编译已经严重恶化。 2021年12月之前,C端平均增量编译将持续3分钟以上,严重影响开发效率,急需优化! 优化后,增量编译时间提升至2分钟左右。
分析Happiness中的app编译过程
主要历时分析
解决方案 LLVM编译优化 LLVM编译流程
.m文件编译从.o文件开始依次经历以下阶段:
可以看到,从源文件编译到目标文件的过程中,做了很多工作。 如果在源文件中添加一行新的代码,那么所有开发者朋友在构建时都必须再次走一遍这一步,减少了很多重复。
海豚分布式编译缓存
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
实用方法资源副本
项目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
幸福是一个集内容、社区、工具于一体的房地产信息与服务平台。 产品基于个性化推荐引擎,向用户推荐优质房产内容和全面真实的房源信息,旨在为用户提供全面、专业、可靠的购房支持。
上海:
广州:
住小帮是一个真实可靠的一站式家居服务平台。 整合大量真实家居案例、实用易懂的家居知识、精挑细选的家居服务命令编译工程源码,陪伴家居装修全过程,让您轻松实现理想家园。
上海: