受美团技术团队的文章《一款可让大型iOS工程编译速度提升50%的工具》所带来的启发,公司的项目开始着手使用 hmap 文件来优化编译速度。
- 问题1:hmap 文件如何在编译时生效呢? 将 hmap 文件添加到工程设置的 HEADER_SEARCH_PATHS 中即可。
- 问题2:hmap 文件在哪? 首先,确保你的工程设置中 Use Header Maps 已经设置成了 YES 然后,编译工程,编译完成后,打开编译记录
找到主工程的编译记录,选择任意一个文件,右键 -> copy
粘贴到文本编辑器中,搜索 .hmap 文件,可以找到如下类型的参数
-I/Users/{用户名}/Library/Developer/Xcode/DerivedData/{随机路径}/Build/Intermediates.noindex/{主工程名}.build/Debug(或者是Release)-iphoneos/{主工程名}.build/{主工程名}-own-target-headers.hmap
OK,这就是主工程的 hmap 文件。通过 Finder 找到对应的目录,可以发现如下的目录结构
注意,这里的 Products 文件夹就是边境变量 ${BUILD_DIR} 所指向的目录,而 Pods 或者其他工程生成的 hmap 文件就保存在上方的 Intermediates.noindex 中
所以,这个 AFNetworking 的 hmap 文件的路径地址就是
"${BUILD_DIR}/../Intermediates.noindex/Pods.build/Release-iphoneos/AFNetworking.build/AFNetworking-own-target-headers.hmap"
注意,上面的是 Release 下的路径,Debug 下 要把 Release-iphoneos 改成 Debug-iphoneos
这里还有一个坑,打包时执行的是 Archive,这时 ${BUILD_DIR} 对应的目录与 Build 不同,子目录结构也发生了变更,相应的,上面的 hmap 文件路径就变成了
"${BUILD_DIR}/../IntermediateBuildFilesPath/Pods.build/Release-iphoneos/AFNetworking.build/AFNetworking-own-target-headers.hmap"
所以,在 release 下,同一个库的 hmap 文件要添加两个地址
- 问题3:所有的 Pods 库都要手动添加 hmap 文件吗?
当然不是。 美团的方案和空白记忆的方案(《由美团文章“一款可以让大型iOS工程编译速度提升50%的工具”引出的.hmap文件(下)hmap落地》) 都是通过 cocoapods 的插件完成。这里我提供一个简单粗暴的方式。 在 Podfile 文件的末尾去执行一段逻辑,结构如下
post_install do |installer_representation|
installer_representation.pods_project.targets.each do |target|
# 遍历 Pods 工程下的每个 target ,根据命名规则,拼接出所有的 hmap 文件路径
end
# 读取 cocoapods 生成的 xcconfig 文件,
# 修改其中的 HEADER_SEARCH_PATHS 数据,把上面拼接出的 hmap 文件路径插入进去
end
上面的逻辑执行后,xcconfig 文件就符合了我们的预期,也达到了不进行手动增删的目的。