编译优化-二进制化
二进制化是大型 iOS 工程编译加速的"银弹":把组件从源码编译改成预编译产物链接,在本地无需再跑 Swift/Clang 前端,直接链接已有的 .a / .framework / .xcframework。美团在 cocoapods-hmap-prebuilt 之外,还通过二进制化把整体编译速度提升 50%+。本文系统介绍二进制化的原理、实现方式与工具链。 为什么能加速 典型项目的编译时间分布(抖音量级): pie title 冷编译耗时占比 "业务代码编译" : 25 "第三方依赖编译" : 50 "链接" : 15 "其他" : 10 超过一半的时间都花在编译 “不会改” 的依赖上。把依赖预编译成二进制,本地只需要链接,这部分耗时直接归零。再配合远程缓存,第一次拉代码的同学也能命中他人产物。 二进制产物形态 静态库(.a) 最传统的形态: libSDWebImage.a SDWebImage/Headers/ ├── SDWebImage.h └── ... 特点: 最小体积,Mach-O 里没有 LC_SEGMENT_64 / LC_LOAD_DYLIB 负担 启动最快,无 dyld 成本 静态链接时整合到主可执行 不支持资源文件(需要单独管理 bundle) Framework(.framework) Apple 推荐的打包形态: SDWebImage.framework/ ├── SDWebImage # 二进制(静态或动态) ├── Headers/ # 公开头文件 ├── Modules/ # modulemap、swiftmodule │ ├── module.modulemap │ └── SDWebImage.swiftmodule/ │ ├── arm64-apple-ios.swiftmodule │ └── arm64-apple-ios.swiftinterface └── Info.plist 通过 Mach-O Type 设置决定内部是静态还是动态库: ...