Levo 指南 · 开发者:Apple

Xcode 为什么这么大? What’s safe to delete

Levo 的 Ready to free 列表,展开了 Xcode 构建数据,下方是模拟器和仿真器以及设备支持文件

Xcode 这个 App 只是其中一部分。真正占地方的是 ~/Library/Developer:构建数据、模拟器、下载的运行时,以及你连接过的每台设备的调试符号。几乎所有这些都会重新生成,所以可以清理。两个例外是归档,以及你仍在使用的模拟器里的数据。

内容位置能安全删除吗?
Xcode.app/Applications/Xcode.app旧版本可以。保留你在用的那个
构建数据~/Library/Developer/Xcode/DerivedData可以,下次构建时会重新生成
模拟器~/Library/Developer/CoreSimulator/Devices可以,但里面的 App 数据也会一并消失
模拟器运行时/Library/Developer/CoreSimulator(磁盘映像)可以,需要时重新下载
设备支持文件~/Library/Developer/Xcode/iOS DeviceSupport可以,连接设备时会再次复制
归档~/Library/Developer/Xcode/Archives仅当该构建已发布且符号文件保存在别处时才可以
缓存~/Library/Caches/com.apple.dt.Xcode可以
SwiftUI 预览~/Library/Developer/Xcode/UserData/Previews可以
命令行工具/Library/Developer/CommandLineTools仅当你装有完整的 Xcode 且不需要单独使用它们时才可以

自己动手清理

先统计各文件夹的大小,把时间花在大的那些上:

du -sh ~/Library/Developer/Xcode/* ~/Library/Developer/CoreSimulator /Library/Developer/CoreSimulator 2>/dev/null
  1. 退出 Xcode,然后删除 DerivedData 中的内容。参见如何删除 DerivedData。
  2. 用 xcrun simctl 或在 Xcode › Settings › Components 中,移除你不用的模拟器和运行时。参见如何删除旧模拟器。
  3. 打开 iOS DeviceSupport,删除你的设备已不再运行的 iOS 版本所对应的文件夹。参见DeviceSupport 是什么。
  4. 使用SwiftPM 和 CocoaPods 缓存中的命令清理包缓存。
  5. 打开 Xcode › Window › Organizer › Archives,看看里面有什么。归档是你发送到 App Store Connect 的那个构建的唯一副本,里面的 dSYM 则用来符号化它的崩溃报告。只有在别处也有这些符号文件时,才删除旧的归档。

/Applications 中的旧版 Xcode 每个约 12 到 15 GB。请在访达中删除它们,而不是把 Developer 文件夹拖走。

各项恢复的代价

最便宜的是 DerivedData:每个项目只会多一次较慢的构建。模拟器运行时需要下载几 GB 并花几分钟,所以只保留你的 App 支持的 iOS 版本。设备支持文件的代价是下次连接 iPhone 时稍等一会儿。

归档则不同。里面的 dSYM 文件能把旧版本的原始崩溃报告变成可读的行。如果你在发布时就把 dSYM 上传到了崩溃分析工具,归档就只是个可以删除的大 zip 文件。如果没有,就保留每个仍在使用的版本的归档。

Xcode 自身的更新也是一个不起眼的原因。每个新版本装在旧版本旁边,都会增加 12 到 15 GB,Xcode 的测试版还会叠加上去。在访达中删除旧副本,倒空废纸篓,空间立刻就回来了。如果 Mac 快满了,先做这件事,因为磁盘满了会让 Xcode 的索引和构建以奇怪的方式失败。

Levo 怎么做

Levo 把 Xcode 构建数据、设备支持文件、模拟器和包缓存分别列成带大小的单独行,让你看出上面哪一项是你的那 80 GB。当项目很旧或已经不存在时,构建数据和缓存会优先被勾选。旧版 Xcode 和归档会列出来,但绝不会替你勾选。

Levo 使用 Xcode 自带的 simctl 移除模拟器,并且在 Xcode、xcodebuild 或已启动的模拟器运行期间,会跳过构建数据。参见面向 iOS 和 Mac 开发者的 Levo。

常见问题

为什么 Xcode 占用了 100 GB?

因为它把东西存在了 App 之外:每个项目的构建数据、模拟器及其运行时、你连接过的每台设备的调试符号,以及归档。App 本身约 15 GB。

我能删除 Xcode 的 Library/Developer 文件夹吗?

不能整个删。清理其中的 DerivedData、CoreSimulator 设备和 DeviceSupport,但保留 Archives 和 UserData 文件夹,除非你不介意丢失 UserData 里保存的键盘快捷键和主题。

删除 DerivedData 会破坏我的项目吗?

不会。你的源码和项目设置都不在里面。下次构建会慢一些,因为 Xcode 要重新构建并重建索引。

模拟器运行时可以放心删除吗?

可以。它们是下载来的,项目需要时 Xcode 会再次获取。删除一个模拟器设备会清除其中的 App 数据。