开启Xcode隐藏配置,彻底解决Xcode打开慢的问题

Xcode隐藏配置

近期通过调试Xcode运行时的配置信息,挖掘出了需要Xcode隐藏配置。

PIFCache

在分析Xcode DerivedData下的目录结构时可以了解到。PIFCache这个数据结构,它提供了一些优化手段,以加快编译速度。其中包括支持多核心编译、减少无用代码编译、预编译头文件等优化方法。在较新的Xcode版本中Apple默认开启了IncrementalPIFTransfer可以提升一些工程的打开速度。但是效果并不理想,反而会导致大型工程下Clean和新增文件的情况下出现卡顿问题。我们可以关闭IncrementalPIFTransfer来减少新增文件时出现的卡顿情况。

defaults write com.apple.dt.Xcode UseIncrementalPIFTransfer -bool NO
复制代码

Xcode全局索引

通常在Xcode每次打开工程时,Xcode需要完成以下任务。

  • 遍历所有的源码文件,计算是否需要生成索引。(首次过程非常漫长,可能会长达30秒以上才能看到目录树。)
  • 分析依赖关系生成构建参数。
  • 后台进行Prebuild生成swiftmodule、framework等前置依赖,用于后续open、edit源码文件后快速进行语法分析以及lint。(所需时间与target数量成正比)
  • 后台生成全局索引,用于后续使用Refactor、Symbol Search、头文件高亮、代码跳转。(所需时间与target数量成正比)

由此可见Xcode全局索引是一个很重的操作。那么有没有什么办法可以关闭全局索引,以及关闭后如果保证索引工程正常使用?

关闭Xcode全局索引

在上面挖掘出的Xcode隐藏配置中有一项配置是IDEIndexDisableBackgroundIndexing。根据字面意思可以分析出这项配置可以单独关闭后台索引(即Xcode全局索引)。比较符合我们的需求。

defaults write com.apple.dt.Xcode IDEIndexDisableBackgroundIndexing -bool YES
复制代码

在Terminal中执行上述命令后并重启Xcode即可让配置生效。 那么接下来分析下关闭Xcode全局索引带来了哪些问题。

关闭Xcode全局索引的优点

  • 每次启动跳过遍历所有源码文件
  • 跳过Prebuild以及Indexing

关闭Xcode全局索引的缺点

高亮着色效率问题

关闭Xcode全局索引后上述任务部分直接不在执行,部分任务延迟到打开文件时进行。 其中打开文件时的大致流程如下:

  • 后台进行Prebuild生成swiftmodule、framework等前置依赖。完成Prebuild之后,对源码文件进行语法分析以及lint。

由于以上流程的存在,可以预知打开文件后可能需要先进行Prebuild再进行语法分析。所以关闭开关后可能会出现语法高亮、代码提示变慢的情况。

头文件高亮/跳转问题

由于Xcode进行语法分析是通过clangswift对源码进行预编译来完成的。clang无法直接处理头文件,只能通过处理c/cpp/mm等文件是顺便处理头文件。所以如果没有完成全局索引会存在头文件无高亮的问题。解决方式也很简单,通过开启BuildWhileIndexing,在编译完成后再去查看头文件,即可解决头文件高亮/跳转的问题。

重构/符号查找问题

关闭Xcode全局索引,在Xcode消费DataStore中的索引数据时数据不完整。那么从数据库中检索出来的符号自然也不完成。解决方式一样是开启BuildWhileIndexing,在编译完成后即可使用重构/符号查找等能力。

Debug/Release/UnitTest/多Target缺少完整索引数据

关闭Xcode全局索引后生成完成的索引数据库强依赖BuildWhileIndexing特性,可是我们通常不会编译所有Target。这样会导致不同编译配置和不同Target总是有一部分索引缺失。 所以当关闭全局索引时,对不参与编译的代码头文件可能会缺少高亮,使用重构、符号查找时可能信息也不完整。

分布式编译/编译缓存兼容性

本地如果开启了CCache编译缓存或分布式编译,可能会遇到一些兼容性问题。因为这些技术通常在编译一个文件时只会返回.o目标文件,编译过程中产生的索引文件留在了远程机器上。所以可能也会存在头文件无法高亮、重构、符号查找数据不完整的问题。

猜你喜欢

转载自juejin.im/post/7189822437482037285