[Xcode]一种低成本的link耗时优化方案

502 阅读5分钟

背景

  • iOS头条工程
  • 500+pod 半数以上静态库
  • 每次既是只改动一行代码,然后运行,link时间大约需要占用60s
  • link时每次都是全量link
  • ld不支持增量link

抖音火山版的优化方案

关于增量编译,我们目前能拿到比较明显的收益就是在开发时将三方库打包成动态库,已经基本实现了增量编译耗时腰斩,从原先的 50s 优化到 30s。

抖音火山版的这个方案是使用动态库包装了静态库,link时间明显减少。但是目前也存在一些问题。

  • 兼容Bundle的获取方式
  • 需要解决符号strip调的问题。

ld耗时分析

阅读源码发现有这个参数可以用来分析ld耗时 通过-Xlinker -print_statistics来看一下。

带LTO首次链接 带LTO二次链接 带LTO三次链接 无LTO首次链接 无LTO二次链接 无LTO三次链接

  • 带不带lto优化影响不大
  • 第一次解析符号相对较长,之后可能是有缓存导致。解析时常缩短。
  • 可以看到option parsing time每次都是17秒左右。

缩短参数的优化方案

在与火山交流时,凑巧聊到,动态库是怎么包装静态库的。得知是通过包装二进制的得来的。 于是想到能不能通过合并静态库,来达到同样的效果呢。于是开始写脚本实验。发现效果还不错。 处理完是这样的。

合并静态库首次链接 合并静态库二次链接 合并静态库三次链接

对比可以看出 processed archive 的数量从1260减少到188个,不仅option parsing time减少了。passess的时间也减少了。

首次link时间减少26~31s,首次之后link时间可以减少30s左右

可以看到合并静态库后,耗时主要在reslove symbols这一阶段。

综上可以认为本方案是可行的。

可能存在的副作用

  • link阶段报错无法指向原来的liba
  • 由于使用libtool合并了多个.o,符号冲突问题被隐藏可能引起一些由于符号冲突导致的问题
  • 生成dsym文件时间变长40s->6分钟

关于App-Infra DevOps 团队

App-Infra DevOps团队作为公司的移动研发中台,致力于优化公司各业务的研发和交付过程中的质量、成本、安全、效率和体验。到目前为止我们已经有超过上百个业务接入,1万+人日常使用;平均每天支撑 3000+研发任务顺利交付;建设了业界领先且可能是国内最大的构建集群,每天运行20万+次构建任务。

我们期待更多有热情和创造力的同学加入字节跳动,为字节打造业界最领先,最高效的生产工具。

我们的工作内容主要包括:

  • 提供任务管理,工程管理,开发调试,交付流程支持的一站式同开发平台。同时提供Native版及Web版,目标成为下一代端云协同的研发基础设施。
  • 客户端 IDE 云化的探索性项目,目的是提供一整套线上编码、调试环境,让用户打开浏览器就可以进行代码开发,满足不同场景的需要,提升研发效率。

加入我们

北京-高级iOS开发工程师 — 终端技术 job.toutiao.com/s/2YHxkXW

职位描述

1、负责公司产品的通用技术研发和性能优化,完成高质量编码和测试工作 2、框架维护,通用工具开发等 3、设计良好的代码结构,不断迭代重构; 4、前沿技术研究,承担重点、难点的技术攻坚

职位要求

1、本科及以上学历,计算机、通信等相关专业 2、具有扎实的编程功底,良好的设计能力和编程习惯 3、熟练掌握Objective-C,C++,熟悉Swift的优先 4、熟悉bash/python/ruby/js的优先

上海-高级iOS开发工程师 — 基础技术 job.toutiao.com/s/2YHm8a7

职位描述

  1. 负责公司客户端产品的通用基础技术研发,完成高质量编码和测试工作
  2. 通用研发工具开发、通用框架开发等
  3. 设计良好的代码结构,不断迭代重构
  4. 前沿技术研究,承担重点、难点的技术攻坚

职位要求

  1. 本科及以上学历,计算机、通信等相关专业
  2. 具有扎实的编程功底,良好的设计能力和编程习惯
  3. 熟练掌握Objective-C,C++,熟悉Swift的优先
  4. 熟悉前后端相关和跨平台技术、熟悉bash/python/ruby/js等语言和相关框架的优先

杭州-高级iOS开发工程师 — 基础技术 job.toutiao.com/s/2YHdPAE

职位描述

  1. 负责公司跨平台相关技术研发,完成高质量编码和测试工作
  2. 负责通用跨端框架及周边工具开发等
  3. 设计良好的代码结构,不断迭代重构
  4. 前沿技术研究,承担重点、难点的技术攻坚

职位要求

  1. 本科及以上学历,计算机、通信等相关专业
  2. 具有扎实的编程功底,良好的设计能力和编程习惯
  3. 熟练掌握Objective-C,C++,熟悉Swift的优先
  4. 熟悉前后端相关和跨平台技术,熟悉bash/python/ruby/js等语言和相关框架的优先