hmap 文件的另一种使用方式

1,162 阅读2分钟

受美团技术团队的文章《一款可让大型iOS工程编译速度提升50%的工具》所带来的启发,公司的项目开始着手使用 hmap 文件来优化编译速度。

  • 问题1:hmap 文件如何在编译时生效呢? 将 hmap 文件添加到工程设置的 HEADER_SEARCH_PATHS 中即可。
  • 问题2:hmap 文件在哪? 首先,确保你的工程设置中 Use Header Maps 已经设置成了 YES 然后,编译工程,编译完成后,打开编译记录

step1.jpg

找到主工程的编译记录,选择任意一个文件,右键 -> copy

step2.jpg

粘贴到文本编辑器中,搜索 .hmap 文件,可以找到如下类型的参数

-I/Users/{用户名}/Library/Developer/Xcode/DerivedData/{随机路径}/Build/Intermediates.noindex/{主工程名}.build/Debug(或者是Release)-iphoneos/{主工程名}.build/{主工程名}-own-target-headers.hmap

OK,这就是主工程的 hmap 文件。通过 Finder 找到对应的目录,可以发现如下的目录结构

step3.jpg

注意,这里的 Products 文件夹就是边境变量 ${BUILD_DIR} 所指向的目录,而 Pods 或者其他工程生成的 hmap 文件就保存在上方的 Intermediates.noindex 中

step4.jpg

所以,这个 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 文件就符合了我们的预期,也达到了不进行手动增删的目的。