<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>编译工程 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-build/</link><description>Recent content in 编译工程 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 27 May 2026 22:24:03 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/posts/interview/ios-build/index.xml" rel="self" type="application/rss+xml"/><item><title>编译优化-Bazel方案</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-build/bazel%E6%96%B9%E6%A1%88/</link><pubDate>Sat, 02 May 2026 22:32:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-build/bazel%E6%96%B9%E6%A1%88/</guid><description>&lt;p&gt;当 iOS 工程的规模突破 CocoaPods / Xcode 原生构建体系的舒适区，Bazel 就成为下一代构建系统的首选。字节跳动的头条、抖音、Airbnb、Uber、Lyft、Pinterest、Square、Bilibili 等都已把 iOS 工程迁到 Bazel。本文介绍 Bazel 的核心原理、在 iOS 上的生态（rules_apple / rules_swift / rules_xcodeproj）以及大厂落地实践。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="为什么是-bazel"&gt;为什么是 Bazel&lt;/h2&gt;
&lt;p&gt;CocoaPods + Xcode 在超大工程上的固有瓶颈：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;粗粒度依赖&lt;/strong&gt;：以 Pod / Target 为单位，增量编译颗粒粗&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;隐式依赖&lt;/strong&gt;：Build Phases 隐含顺序，难以沙箱化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;难以远程缓存&lt;/strong&gt;：编译环境非 hermetic，hash 易变&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;难以远程执行&lt;/strong&gt;：Xcode Build System 绑定本地 macOS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bazel 针对这些问题从设计之初就提供了：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;能力&lt;/th&gt;
&lt;th&gt;Bazel&lt;/th&gt;
&lt;th&gt;Xcode/CocoaPods&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;依赖粒度&lt;/td&gt;
&lt;td&gt;文件级&lt;/td&gt;
&lt;td&gt;Target 级&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;依赖显式化&lt;/td&gt;
&lt;td&gt;必须声明&lt;/td&gt;
&lt;td&gt;部分隐式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sandbox&lt;/td&gt;
&lt;td&gt;默认开启&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;远程缓存&lt;/td&gt;
&lt;td&gt;原生&lt;/td&gt;
&lt;td&gt;需第三方（ccache/Rugby）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;远程执行&lt;/td&gt;
&lt;td&gt;原生&lt;/td&gt;
&lt;td&gt;不支持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;跨语言&lt;/td&gt;
&lt;td&gt;一流（Swift/OC/C++/Go/Rust/JS）&lt;/td&gt;
&lt;td&gt;主要 Apple 平台&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多平台&lt;/td&gt;
&lt;td&gt;天生&lt;/td&gt;
&lt;td&gt;iOS/macOS 为主&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="bazel-核心概念"&gt;Bazel 核心概念&lt;/h2&gt;
&lt;h3 id="workspace-与-package"&gt;Workspace 与 Package&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WORKSPACE # 仓库根，声明外部依赖
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;foo/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── BUILD.bazel # package，本目录的构建声明
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── main.swift
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── util/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── BUILD.bazel # 子 package
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Workspace&lt;/strong&gt;：整个 Bazel 仓库，一个 WORKSPACE 文件一个仓&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Package&lt;/strong&gt;：任何包含 &lt;code&gt;BUILD.bazel&lt;/code&gt; 的目录&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Target&lt;/strong&gt;：BUILD 文件里的一个 rule 调用，比如 &lt;code&gt;swift_library(name = &amp;quot;foo&amp;quot;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Label&lt;/strong&gt;：Target 的全局 ID，形如 &lt;code&gt;//foo/util:util&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="rule"&gt;Rule&lt;/h3&gt;
&lt;p&gt;Rule 是构建函数，输入 sources + deps，输出 artifacts：&lt;/p&gt;</description></item><item><title>编译优化-CocoaPods优化</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-build/cocoapods%E4%BC%98%E5%8C%96/</link><pubDate>Sat, 02 May 2026 22:32:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-build/cocoapods%E4%BC%98%E5%8C%96/</guid><description>&lt;p&gt;在 iOS 生态中，CocoaPods 依然是大多数中大型工程的依赖管理工具。当 Pod 数量达到几百个子组件上千个时，&lt;code&gt;pod install&lt;/code&gt; 的耗时会变成研发流程里的硬性卡点。抖音在其 &lt;code&gt;seer-optimize&lt;/code&gt; 项目中系统化地优化了 CocoaPods 的整个生命周期，全量 Pod Install 耗时减少 50%、增量减少 65%。本文系统介绍这些优化背后的原理。&lt;/p&gt;
&lt;p&gt;关于 CocoaPods 整体架构的深度介绍可以参考 &lt;a href="https://amatsuzero.github.io/LastStand/posts/interview/ios-source-analysis/cocoapods-%E6%9E%B6%E6%9E%84%E6%80%BB%E8%A7%88/"&gt;CocoaPods源码导读-架构总览&lt;/a&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="pod-install-耗时构成"&gt;Pod Install 耗时构成&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Installer#install!&lt;/code&gt; 的六个阶段：&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
A[prepare] --&gt; B[resolve_dependencies]
B --&gt; C[download_dependencies]
C --&gt; D[validate_targets]
D --&gt; E[generate_pods_project]
E --&gt; F[integrate_user_project]
&lt;/pre&gt;
&lt;p&gt;抖音公开的典型耗时分布：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;阶段&lt;/th&gt;
&lt;th&gt;典型耗时&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;prepare&lt;/td&gt;
&lt;td&gt;&amp;lt; 0.01s&lt;/td&gt;
&lt;td&gt;初始化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;resolve_dependencies&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;数秒到数分钟&lt;/td&gt;
&lt;td&gt;依赖决议，瓶颈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;download_dependencies&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;数秒到数分钟&lt;/td&gt;
&lt;td&gt;依赖下载，IO 密集&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;validate_targets&lt;/td&gt;
&lt;td&gt;0.1s&lt;/td&gt;
&lt;td&gt;校验&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;generate_pods_project&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;数秒到数十秒&lt;/td&gt;
&lt;td&gt;生成 xcodeproj&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;integrate_user_project&lt;/td&gt;
&lt;td&gt;0.01s&lt;/td&gt;
&lt;td&gt;集成主工程&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="resolve_dependencies-优化"&gt;resolve_dependencies 优化&lt;/h2&gt;
&lt;h3 id="source-仓库更新"&gt;Source 仓库更新&lt;/h3&gt;
&lt;p&gt;默认 CocoaPods 在 &lt;code&gt;pod install --repo-update&lt;/code&gt; 时会更新&lt;strong&gt;所有&lt;/strong&gt; source 仓库。抖音改造为：&lt;/p&gt;</description></item><item><title>编译优化-Explicit Modules</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-build/explicit-modules/</link><pubDate>Tue, 05 May 2026 00:41:41 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-build/explicit-modules/</guid><description>&lt;p&gt;Apple 从 Xcode 15 开始在 Swift 上引入 Explicit Modules，Xcode 16 在 C/C++/Objective-C 上全面铺开，Xcode 17 进一步默认启用并与细粒度依赖追踪结合。这是近五年 Apple 构建系统最重要的一次变革，直接影响到大部分项目的编译模型。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="模块module基础"&gt;模块（Module）基础&lt;/h2&gt;
&lt;h3 id="为什么需要模块"&gt;为什么需要模块&lt;/h3&gt;
&lt;p&gt;C 家族语言的 &lt;code&gt;#include&lt;/code&gt; 机制有两个致命问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;文本替换&lt;/strong&gt;：头文件是纯文本替换，每个源文件都要重新解析一遍所有包含的头文件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;宏污染&lt;/strong&gt;：先引入的头文件宏会影响后续头文件的行为，没有隔离&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Clang 在 2012 年引入 &lt;strong&gt;Clang Modules&lt;/strong&gt;，用一个预编译的二进制模块（&lt;code&gt;.pcm&lt;/code&gt;）替代文本包含，同一 module 在一次构建里只解析一次。Swift 的 &lt;code&gt;.swiftmodule&lt;/code&gt; 从设计之初就是模块化的。&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
A["源文件"] --&gt;|"include 头文件"| B["Foundation.h 文本"];
B --&gt; C["每次都重新解析"];
D["源文件"] --&gt;|"@import Foundation"| E["Foundation.pcm 预编译"];
E --&gt; F["一次解析，多次复用"];
&lt;/pre&gt;
&lt;h3 id="模块的组成"&gt;模块的组成&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;载体&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Clang Module&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.pcm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;C/OC 模块的序列化 AST&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Swift Module&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.swiftmodule&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Swift 模块的接口 + SIL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Swift Interface&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.swiftinterface&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;可被不同 Swift 版本解析的文本接口&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Module Map&lt;/td&gt;
&lt;td&gt;&lt;code&gt;module.modulemap&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;描述哪些头文件构成某个 module&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="implicit-modules-的问题"&gt;Implicit Modules 的问题&lt;/h2&gt;
&lt;h3 id="原理"&gt;原理&lt;/h3&gt;
&lt;p&gt;在 Xcode 16 之前，Clang Modules 以 &lt;strong&gt;隐式&lt;/strong&gt; 方式工作：&lt;/p&gt;</description></item><item><title>编译优化-Swift编译优化</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-build/swift%E7%BC%96%E8%AF%91%E4%BC%98%E5%8C%96/</link><pubDate>Sat, 02 May 2026 22:32:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-build/swift%E7%BC%96%E8%AF%91%E4%BC%98%E5%8C%96/</guid><description>&lt;p&gt;Swift 的类型推导、泛型约束求解、WMO / CMO 是编译性能的核心影响因素。理解它们能让源码层面的小改动带来显著的编译加速。本文聚焦&amp;quot;代码写法 + 编译开关&amp;quot;两方面的优化。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="swift-编译流程速览"&gt;Swift 编译流程速览&lt;/h2&gt;
&lt;p&gt;相比 C/OC，Swift 编译多出大量工作：&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
A[Parse] --&gt; B[Sema&lt;br/&gt;类型检查]
B --&gt; C[SILGen&lt;br/&gt;生成 SIL]
C --&gt; D[SIL Optimization]
D --&gt; E[IRGen&lt;br/&gt;LLVM IR]
E --&gt; F[LLVM Optimization]
F --&gt; G[CodeGen]
&lt;/pre&gt;
&lt;p&gt;其中 &lt;strong&gt;Sema（语义分析）&lt;/strong&gt; 阶段负责类型推导，是 Swift 特有的性能热点。&lt;code&gt;-debug-time-compilation&lt;/code&gt; 看到的 &amp;ldquo;Type checking&amp;rdquo; 时间基本都集中在这里。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="类型推导与-too-complex-错误"&gt;类型推导与 &amp;ldquo;Too Complex&amp;rdquo; 错误&lt;/h2&gt;
&lt;h3 id="约束求解"&gt;约束求解&lt;/h3&gt;
&lt;p&gt;Swift 的类型系统比大多数语言复杂：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;函数重载 + 运算符重载&lt;/li&gt;
&lt;li&gt;隐式字面量类型（&lt;code&gt;Int&lt;/code&gt;、&lt;code&gt;Double&lt;/code&gt;、&lt;code&gt;Float80&lt;/code&gt;…）&lt;/li&gt;
&lt;li&gt;泛型 + 协议 + 关联类型&lt;/li&gt;
&lt;li&gt;闭包参数类型推导&lt;/li&gt;
&lt;li&gt;SwiftUI 风格的 ViewBuilder / Result Builders&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;遇到表达式 &lt;code&gt;let x = a + b * c - d&lt;/code&gt;，编译器需要给 &lt;code&gt;+ * -&lt;/code&gt; 每个运算符枚举所有可能的重载，在多个候选里做约束传播。当候选组合爆炸时，Sema 会放弃并抛出：&lt;/p&gt;</description></item><item><title>编译优化-Xcode构建系统</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-build/xcode%E6%9E%84%E5%BB%BA%E7%B3%BB%E7%BB%9F/</link><pubDate>Sat, 02 May 2026 22:32:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-build/xcode%E6%9E%84%E5%BB%BA%E7%B3%BB%E7%BB%9F/</guid><description>&lt;p&gt;Xcode 的构建系统由多个组件协同完成，从 &lt;code&gt;Cmd+B&lt;/code&gt; 到生成 &lt;code&gt;.app&lt;/code&gt; 经历了完整的任务图构建、依赖分析、并行调度流程。理解这套体系是后续一切优化的基础。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="构建系统组成"&gt;构建系统组成&lt;/h2&gt;
&lt;p&gt;Xcode 10 之后默认采用 &lt;strong&gt;Swift Build System&lt;/strong&gt;（基于 llbuild），整体架构如下：&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
A[Xcode IDE] --&gt; B[XCBBuildService&lt;br/&gt;Daemon]
B --&gt; C[Build Description&lt;br/&gt;任务图 JSON]
C --&gt; D[llbuild&lt;br/&gt;调度内核]
D --&gt; E1[Swift Driver / swiftc]
D --&gt; E2[clang]
D --&gt; E3[ld / ld-prime]
D --&gt; E4[actool / ibtool / 脚本]
E1 &amp; E2 &amp; E3 &amp; E4 --&gt; F[产物缓存]
&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;组件&lt;/th&gt;
&lt;th&gt;职责&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;XCBBuildService&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;独立进程，为 Xcode / xcodebuild 提供构建 RPC 服务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build Description&lt;/td&gt;
&lt;td&gt;根据 Scheme、Target、Build Settings 生成的任务图&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;llbuild&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;通用构建引擎，执行任务图、做增量与并行调度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;swift-driver&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Swift 编译驱动，生成 frontend job 并驱动 swiftc&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;clang&lt;/code&gt; / &lt;code&gt;swift-frontend&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;真正的编译器前端&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ld&lt;/code&gt; / &lt;code&gt;ld-prime&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;链接器&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="xcbbuildservice"&gt;XCBBuildService&lt;/h3&gt;
&lt;p&gt;Xcode 和 &lt;code&gt;xcodebuild&lt;/code&gt; 都是&lt;strong&gt;客户端&lt;/strong&gt;，真正的构建逻辑在 &lt;code&gt;XCBBuildService&lt;/code&gt; 这个独立进程。它通过 XPC 接收请求，生成并执行任务。社区工具 &lt;a href="https://github.com/target/XCBBuildServiceProxy"&gt;&lt;code&gt;XCBBuildServiceProxy&lt;/code&gt;&lt;/a&gt; 利用这一架构在中间插一层代理，实现自定义构建（Bazel、远程执行等）。字节 &lt;code&gt;BitSky&lt;/code&gt;、Tuist Cloud 都基于此类模式。&lt;/p&gt;</description></item><item><title>编译优化-二进制化</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-build/%E4%BA%8C%E8%BF%9B%E5%88%B6%E5%8C%96/</link><pubDate>Sat, 02 May 2026 22:32:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-build/%E4%BA%8C%E8%BF%9B%E5%88%B6%E5%8C%96/</guid><description>&lt;p&gt;二进制化是大型 iOS 工程编译加速的&amp;quot;银弹&amp;quot;：把组件从源码编译改成预编译产物链接，在本地无需再跑 Swift/Clang 前端，直接链接已有的 &lt;code&gt;.a&lt;/code&gt; / &lt;code&gt;.framework&lt;/code&gt; / &lt;code&gt;.xcframework&lt;/code&gt;。美团在 &lt;code&gt;cocoapods-hmap-prebuilt&lt;/code&gt; 之外，还通过二进制化把整体编译速度提升 50%+。本文系统介绍二进制化的原理、实现方式与工具链。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="为什么能加速"&gt;为什么能加速&lt;/h2&gt;
&lt;p&gt;典型项目的编译时间分布（抖音量级）：&lt;/p&gt;
&lt;pre class="mermaid"&gt;pie title 冷编译耗时占比
"业务代码编译" : 25
"第三方依赖编译" : 50
"链接" : 15
"其他" : 10
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;超过一半的时间都花在编译 &amp;ldquo;不会改&amp;rdquo; 的依赖上&lt;/strong&gt;。把依赖预编译成二进制，本地只需要链接，这部分耗时直接归零。再配合远程缓存，第一次拉代码的同学也能命中他人产物。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="二进制产物形态"&gt;二进制产物形态&lt;/h2&gt;
&lt;h3 id="静态库a"&gt;静态库（.a）&lt;/h3&gt;
&lt;p&gt;最传统的形态：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;libSDWebImage.a
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SDWebImage/Headers/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── SDWebImage.h
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── ...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最小体积，Mach-O 里没有 LC_SEGMENT_64 / LC_LOAD_DYLIB 负担&lt;/li&gt;
&lt;li&gt;启动最快，无 dyld 成本&lt;/li&gt;
&lt;li&gt;静态链接时整合到主可执行&lt;/li&gt;
&lt;li&gt;不支持资源文件（需要单独管理 bundle）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="frameworkframework"&gt;Framework（.framework）&lt;/h3&gt;
&lt;p&gt;Apple 推荐的打包形态：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SDWebImage.framework/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── SDWebImage # 二进制（静态或动态）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── Headers/ # 公开头文件
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── Modules/ # modulemap、swiftmodule
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── module.modulemap
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ └── SDWebImage.swiftmodule/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── arm64-apple-ios.swiftmodule
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ └── arm64-apple-ios.swiftinterface
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── Info.plist
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通过 &lt;code&gt;Mach-O Type&lt;/code&gt; 设置决定内部是静态还是动态库：&lt;/p&gt;</description></item><item><title>编译优化-二进制化实现原理</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-build/%E4%BA%8C%E8%BF%9B%E5%88%B6%E5%8C%96%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86/</link><pubDate>Fri, 08 May 2026 22:56:38 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-build/%E4%BA%8C%E8%BF%9B%E5%88%B6%E5%8C%96%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86/</guid><description>&lt;p&gt;本文结合 &lt;a href="https://github.com/tripleCC/cocoapods-bin"&gt;cocoapods-bin&lt;/a&gt;（社区最成熟的二进制化插件）拆解&amp;quot;Pod 二进制化&amp;quot;背后的工程机制：集成时如何透明替换 spec、打包时如何还原 Xcode 产物、调试时如何跳回源码。文末给出&amp;quot;自研一套二进制系统&amp;quot;的落地 checklist。&lt;/p&gt;
&lt;p&gt;想先了解二进制化的整体背景、坑点和适用场景，可以先看 &lt;a href="https://amatsuzero.github.io/LastStand/posts/interview/ios-build/%E4%BA%8C%E8%BF%9B%E5%88%B6%E5%8C%96/"&gt;编译优化-二进制化&lt;/a&gt;；想了解 pod install 阶段本身的优化（HMap、并发下载等）见 &lt;a href="https://amatsuzero.github.io/LastStand/posts/interview/ios-build/cocoapods%E4%BC%98%E5%8C%96/"&gt;编译优化-CocoaPods优化&lt;/a&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="总体架构"&gt;总体架构&lt;/h2&gt;
&lt;p&gt;一套完整的 Pod 二进制化系统由三层组成：&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TB
subgraph CI[打包 CI]
A1[源码 podspec] --&gt; A2[壳工程 pod install]
A2 --&gt; A3[xcodebuild 双 SDK 编译]
A3 --&gt; A4[lipo / create-xcframework]
A4 --&gt; A5[上传 OSS]
A5 --&gt; A6[生成 binary podspec]
A6 --&gt; A7[push 到二进制仓]
end
subgraph Dev[开发机 pod install]
B1[Podfile 声明 plugin] --&gt; B2[Resolver/LazySpecification Hook]
B2 --&gt; B3{二进制仓&lt;br/&gt;是否有该版本?}
B3 -- 是 --&gt; B4[替换为 binary spec]
B3 -- 否 --&gt; B5[回退源码 spec]
B4 --&gt; B6[pod download zip]
B5 --&gt; B6
B6 --&gt; B7[Xcode 链接]
end
subgraph Debug[调试]
C1[dwarfdump 读取&lt;br/&gt;DW_AT_comp_dir] --&gt; C2[下载源码]
C2 --&gt; C3[软链到 DWARF 路径]
C3 --&gt; C4[LLDB 自动跳转源码]
end
A7 --&gt; B3
A3 -.DWARF 路径信息.-&gt; C1
&lt;/pre&gt;
&lt;p&gt;关键设计点：&lt;/p&gt;</description></item><item><title>编译优化-头文件与HMap</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-build/%E5%A4%B4%E6%96%87%E4%BB%B6%E4%B8%8Ehmap/</link><pubDate>Sat, 02 May 2026 22:32:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-build/%E5%A4%B4%E6%96%87%E4%BB%B6%E4%B8%8Ehmap/</guid><description>&lt;p&gt;对以 Objective-C 为主或混编的 iOS 大型工程，头文件查找是一个被严重低估的编译开销点。美团的统计显示，400+ Pod 组件的工程会产生近 5 万个头文件，导致海量的 IO 操作和编译参数膨胀。Header Map（HMap）技术能把头文件查找从 O(n) 的目录扫描退化为 O(1) 的哈希查表。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="头文件查找的代价"&gt;头文件查找的代价&lt;/h2&gt;
&lt;h3 id="clang-的查找流程"&gt;Clang 的查找流程&lt;/h3&gt;
&lt;p&gt;当 Clang 遇到 &lt;code&gt;#import &amp;lt;AFNetworking/AFNetworking.h&amp;gt;&lt;/code&gt; 时：&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
A[遇到 #import] --&gt; B{是否系统头?}
B -- 是 --&gt; C[SYSTEM_HEADER_SEARCH_PATHS]
B -- 否 --&gt; D[USER_HEADER_SEARCH_PATHS]
C --&gt; E[按顺序遍历 HEADER_SEARCH_PATHS]
D --&gt; E
E --&gt; F{路径下有吗?}
F -- 否 --&gt; G[下一个路径]
G --&gt; E
F -- 是 --&gt; H[stat + open]
H --&gt; I[解析头文件]
&lt;/pre&gt;
&lt;p&gt;每一次查找都要对&lt;strong&gt;所有&lt;/strong&gt; &lt;code&gt;HEADER_SEARCH_PATHS&lt;/code&gt; 执行 &lt;code&gt;stat(2)&lt;/code&gt; 系统调用，当路径数量达到数千时，光 &lt;code&gt;stat&lt;/code&gt; 就是显著开销。&lt;/p&gt;</description></item><item><title>编译优化-编译缓存</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-build/%E7%BC%96%E8%AF%91%E7%BC%93%E5%AD%98/</link><pubDate>Fri, 08 May 2026 13:07:14 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-build/%E7%BC%96%E8%AF%91%E7%BC%93%E5%AD%98/</guid><description>&lt;p&gt;&amp;ldquo;已经编译过的东西不再编译一遍&amp;rdquo;——这是编译优化的基础原理。Xcode 的增量编译、CocoaPods 的二进制缓存、Bazel 的 Action Cache 都是不同层次的编译缓存。本文聚焦 &lt;code&gt;ccache&lt;/code&gt;、Clang/Swift module cache、远程缓存等通用方案的原理与 iOS 落地。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="缓存分层"&gt;缓存分层&lt;/h2&gt;
&lt;p&gt;缓存按命中粒度可以分为三个层次：&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
A[编译缓存] --&gt; B[编译器内部缓存&lt;br/&gt;PCH/PCM/module cache]
A --&gt; C[Action 级缓存&lt;br/&gt;ccache/sccache]
A --&gt; D[产物级缓存&lt;br/&gt;framework/xcframework]
B --&gt; B1[进程内复用模块]
C --&gt; C1[按 .o 粒度缓存]
D --&gt; D1[按 Pod/module 缓存]
&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;层次&lt;/th&gt;
&lt;th&gt;粒度&lt;/th&gt;
&lt;th&gt;代表&lt;/th&gt;
&lt;th&gt;命中率&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;编译器内部&lt;/td&gt;
&lt;td&gt;frontend 解析结果&lt;/td&gt;
&lt;td&gt;Clang ModuleCache、Swift Module Cache&lt;/td&gt;
&lt;td&gt;高（本地）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Action&lt;/td&gt;
&lt;td&gt;源文件 → 目标文件&lt;/td&gt;
&lt;td&gt;ccache、sccache、Bazel&lt;/td&gt;
&lt;td&gt;中（取决于参数稳定性）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;产物&lt;/td&gt;
&lt;td&gt;整个 Pod 或 module&lt;/td&gt;
&lt;td&gt;cocoapods-bin、Rugby&lt;/td&gt;
&lt;td&gt;高（版本号稳定）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="clang-module-cache"&gt;Clang Module Cache&lt;/h2&gt;
&lt;h3 id="原理"&gt;原理&lt;/h3&gt;
&lt;p&gt;Clang 的 &lt;code&gt;@import&lt;/code&gt; / &lt;code&gt;@_exported import&lt;/code&gt; 会把外部模块预编译成 &lt;code&gt;.pcm&lt;/code&gt;，缓存到 &lt;code&gt;ModuleCachePath&lt;/code&gt;：&lt;/p&gt;</description></item><item><title>编译优化-观测</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-build/%E8%A7%82%E6%B5%8B/</link><pubDate>Tue, 05 May 2026 00:41:41 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-build/%E8%A7%82%E6%B5%8B/</guid><description>&lt;p&gt;&amp;ldquo;无法度量就无法优化&amp;rdquo;。在开始任何编译优化动作之前，必须先建立一套可重复、可对比的观测手段，否则改动的真实收益无从谈起。本文介绍 iOS 编译耗时观测的主要工具链和原理。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="观测目标分层"&gt;观测目标分层&lt;/h2&gt;
&lt;p&gt;不同层次的观测工具回答不同的问题：&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
A[编译耗时观测] --&gt; B[整体耗时]
A --&gt; C[阶段耗时]
A --&gt; D[任务级耗时]
A --&gt; E[函数/表达式级]
B --&gt; B1[xcodebuild 总耗时]
C --&gt; C1[Build Timing Summary]
C --&gt; C2[Pod Install 阶段计时]
D --&gt; D1[Build Timeline]
D --&gt; D2[XCLogParser]
E --&gt; E1[-debug-time-compilation]
E --&gt; E2[-warn-long-expression]
&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;观测层次&lt;/th&gt;
&lt;th&gt;典型问题&lt;/th&gt;
&lt;th&gt;工具&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;整体&lt;/td&gt;
&lt;td&gt;一次构建花了多久？&lt;/td&gt;
&lt;td&gt;&lt;code&gt;time xcodebuild&lt;/code&gt;、MetricKit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;阶段&lt;/td&gt;
&lt;td&gt;哪个阶段最慢？&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-showBuildTimingSummary&lt;/code&gt;、Build Timing Summary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;任务&lt;/td&gt;
&lt;td&gt;哪个文件/目标最慢？&lt;/td&gt;
&lt;td&gt;Xcode Build Timeline、XCLogParser&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;函数级&lt;/td&gt;
&lt;td&gt;哪个函数/表达式让前端卡住？&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-debug-time-function-bodies&lt;/code&gt;、&lt;code&gt;-warn-long-expression-type-checking&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="整体耗时"&gt;整体耗时&lt;/h2&gt;
&lt;h3 id="xcodebuild-命令行计时"&gt;xcodebuild 命令行计时&lt;/h3&gt;
&lt;p&gt;最简单也最稳定的方式是直接给 &lt;code&gt;xcodebuild&lt;/code&gt; 加 &lt;code&gt;time&lt;/code&gt;：&lt;/p&gt;</description></item><item><title>编译优化-链接优化</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-build/%E9%93%BE%E6%8E%A5%E4%BC%98%E5%8C%96/</link><pubDate>Sat, 02 May 2026 22:32:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-build/%E9%93%BE%E6%8E%A5%E4%BC%98%E5%8C%96/</guid><description>&lt;p&gt;链接是 iOS 编译的最后一个阶段，也是大型工程里经常被忽略的瓶颈。Apple 在 WWDC22 的 &amp;ldquo;Link fast: Improve build and launch times&amp;rdquo; 演讲中公开：Xcode 14 新的 &lt;code&gt;ld-prime&lt;/code&gt; 链接器比 &lt;code&gt;ld64&lt;/code&gt; 快 &lt;strong&gt;2 倍&lt;/strong&gt;。随着 Xcode 17、ThinLTO、Mergeable Libraries 等改进，链接优化已经成为编译加速的重要一环。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="链接器的职责"&gt;链接器的职责&lt;/h2&gt;
&lt;p&gt;链接器把多个 &lt;code&gt;.o&lt;/code&gt; 合并成最终可执行文件或库：&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
A[若干 .o] --&gt; L[链接器]
B[静态库 .a] --&gt; L
C[动态库 .dylib / framework] --&gt; L
L --&gt; D[符号解析]
D --&gt; E[dead_strip]
E --&gt; F[ObjC runtime fix-up]
F --&gt; G[生成 LC_* 加载命令]
G --&gt; H[写入 Mach-O]
&lt;/pre&gt;
&lt;p&gt;关键任务：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;符号解析&lt;/strong&gt;：所有 undefined symbol 必须在某个 .o / .a / .dylib 里找到&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重定位&lt;/strong&gt;：把符号引用的偏移写入正确位置&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dead Strip&lt;/strong&gt;：去掉未被使用的代码/数据&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ObjC 元数据修复&lt;/strong&gt;：把分散的类、分类信息合并成 ObjC runtime 能识别的结构&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生成 Mach-O&lt;/strong&gt;：写 Load Commands、&lt;code&gt;__LINKEDIT&lt;/code&gt; 等段&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="链接器对比"&gt;链接器对比&lt;/h2&gt;
&lt;h3 id="ld64经典"&gt;ld64（经典）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ld64&lt;/code&gt; 是 Apple 长期使用的经典链接器，源代码在 &lt;a href="https://github.com/apple-oss-distributions/ld64"&gt;apple-oss-distributions/ld64&lt;/a&gt;。单线程为主，在大工程上明显偏慢。&lt;/p&gt;</description></item><item><title>编译优化</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-build/%E7%BC%96%E8%AF%91%E4%BC%98%E5%8C%96/</link><pubDate>Wed, 27 May 2026 22:24:03 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-build/%E7%BC%96%E8%AF%91%E4%BC%98%E5%8C%96/</guid><description>&lt;p&gt;大型 iOS 工程的编译耗时往往是研发效能最突出的瓶颈之一。以抖音、今日头条、美团为代表的一线团队，工程代码量通常在数百万到千万行级，本地全量编译耗时 10 分钟以上、CI 上半小时起步已是常态。编译等待不仅直接压缩研发时间，还会打断心流、降低人均产出。&lt;/p&gt;
&lt;p&gt;本系列文章从 iOS 编译系统的原理出发，结合社区最新实践（Xcode 16/17 Explicit Modules、rules_xcodeproj、seer-optimize、cocoapods-hmap-prebuilt、Rugby 等），系统性介绍编译优化的各类手段与背后的原理。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="编译流程概述"&gt;编译流程概述&lt;/h2&gt;
&lt;p&gt;理解&lt;a href="https://amatsuzero.github.io/LastStand/posts/interview/ios-basics/ios%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86/"&gt;iOS编译原理&lt;/a&gt;是编译优化的前提。一次典型的 iOS 编译流程可以划分为以下阶段：&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
A[Parse Podfile / 生成工程] --&gt; B[Pod Install / 依赖解析]
B --&gt; C[Xcode Build System 调度]
C --&gt; D[Dependency Scan / 模块依赖扫描]
D --&gt; E[Swift/Clang 前端编译]
E --&gt; F[生成 .o / .swiftmodule / .pcm]
F --&gt; G[链接 ld64 / ld-prime / lld]
G --&gt; H[签名 / 打包 / 资源处理]
H --&gt; I[产出 .app / .ipa]
&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;阶段&lt;/th&gt;
&lt;th&gt;主要工作&lt;/th&gt;
&lt;th&gt;常见瓶颈&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;依赖管理&lt;/td&gt;
&lt;td&gt;Pod Install、SPM 解析&lt;/td&gt;
&lt;td&gt;Source 更新慢、Specification 解析重复、沙盒拷贝&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;工程生成&lt;/td&gt;
&lt;td&gt;生成 Pods.xcodeproj、xcconfig、hmap&lt;/td&gt;
&lt;td&gt;Target 数量多、pbxproj 膨胀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;构建调度&lt;/td&gt;
&lt;td&gt;Build System 解析任务图、并行调度&lt;/td&gt;
&lt;td&gt;依赖粒度过粗、并行度不足&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;模块扫描&lt;/td&gt;
&lt;td&gt;Clang/Swift 依赖扫描&lt;/td&gt;
&lt;td&gt;隐式模块重复编译&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;源码编译&lt;/td&gt;
&lt;td&gt;Swift/Clang 前端、类型检查、SIL/IR 生成&lt;/td&gt;
&lt;td&gt;类型推导爆炸、WMO 关闭、PCH 失效&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;链接&lt;/td&gt;
&lt;td&gt;符号解析、LTO、dead-strip&lt;/td&gt;
&lt;td&gt;链接参数过长、ThinLTO 串行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;收尾&lt;/td&gt;
&lt;td&gt;签名、资源拷贝、dSYM&lt;/td&gt;
&lt;td&gt;串行脚本阻塞&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="优化思路全景"&gt;优化思路全景&lt;/h2&gt;
&lt;p&gt;编译优化的核心思路只有三条：&lt;strong&gt;减少需要做的工作&lt;/strong&gt;、&lt;strong&gt;让必须做的工作更快&lt;/strong&gt;、&lt;strong&gt;让做过的工作可复用&lt;/strong&gt;。所有社区实践都可以归入这三类。&lt;/p&gt;</description></item></channel></rss>