编译优化
大型 iOS 工程的编译耗时往往是研发效能最突出的瓶颈之一。以抖音、今日头条、美团为代表的一线团队,工程代码量通常在数百万到千万行级,本地全量编译耗时 10 分钟以上、CI 上半小时起步已是常态。编译等待不仅直接压缩研发时间,还会打断心流、降低人均产出。 本系列文章从 iOS 编译系统的原理出发,结合社区最新实践(Xcode 16/17 Explicit Modules、rules_xcodeproj、seer-optimize、cocoapods-hmap-prebuilt、Rugby 等),系统性介绍编译优化的各类手段与背后的原理。 编译流程概述 理解iOS编译原理是编译优化的前提。一次典型的 iOS 编译流程可以划分为以下阶段: flowchart TD A[Parse Podfile / 生成工程] --> B[Pod Install / 依赖解析] B --> C[Xcode Build System 调度] C --> D[Dependency Scan / 模块依赖扫描] D --> E[Swift/Clang 前端编译] E --> F[生成 .o / .swiftmodule / .pcm] F --> G[链接 ld64 / ld-prime / lld] G --> H[签名 / 打包 / 资源处理] H --> I[产出 .app / .ipa] 阶段 主要工作 常见瓶颈 依赖管理 Pod Install、SPM 解析 Source 更新慢、Specification 解析重复、沙盒拷贝 工程生成 生成 Pods.xcodeproj、xcconfig、hmap Target 数量多、pbxproj 膨胀 构建调度 Build System 解析任务图、并行调度 依赖粒度过粗、并行度不足 模块扫描 Clang/Swift 依赖扫描 隐式模块重复编译 源码编译 Swift/Clang 前端、类型检查、SIL/IR 生成 类型推导爆炸、WMO 关闭、PCH 失效 链接 符号解析、LTO、dead-strip 链接参数过长、ThinLTO 串行 收尾 签名、资源拷贝、dSYM 串行脚本阻塞 优化思路全景 编译优化的核心思路只有三条:减少需要做的工作、让必须做的工作更快、让做过的工作可复用。所有社区实践都可以归入这三类。 ...