开发者

Xcode DerivedData、旧模拟器和 iOS DeviceSupport 可以放心删除吗?

~/Library/Developer 中每个 Xcode 文件夹存放什么、哪些会被重建、为什么 Archives 要谨慎,以及删除模拟器的 simctl 命令。

阅读约需 9 分钟MoreRoom 团队,Yando Pte. Ltd.以 Markdown 格式查看本页

要点速览

  • DerivedData 可以放心删除:下次构建时 Xcode 会重新生成,代价只是一次较慢的构建和重新索引。
  • iOS DeviceSupport 文件夹可以放心删除;下次连接运行该系统版本的设备时,Xcode 会重新拷贝符号文件。
  • 不要随手删除 Xcode Archives。它们包含 dSYM 文件,Xcode 需要用它们来符号化已发布版本的崩溃报告。
  • 请用 xcrun simctl delete unavailable 删除模拟器,用 xcrun simctl runtime delete 删除运行时,而不是手动删除文件夹。
  • 每个模拟器运行时通常有 7–10 GB,移除不再测试的 iOS 版本,往往是单项收益最大的一步。

如何安全清理 Xcode 占用的储存空间

  1. 退出 Xcode 和模拟器. 退出 Xcode 和“模拟器”App,确保没有构建、索引或已启动的设备正在使用你要清理的文件夹。
  2. 删除 DerivedData. 在访达中打开 ~/Library/Developer/Xcode/DerivedData,把其中的内容移到废纸篓。下次构建时 Xcode 会重新生成所需内容。
  3. 移除旧的 DeviceSupport 文件夹. 在 ~/Library/Developer/Xcode/iOS DeviceSupport 中,把不再调试的系统版本和设备对应的文件夹移到废纸篓。
  4. 删除不可用的模拟器. 在“终端”中运行 xcrun simctl delete unavailable,移除运行时已不再安装的模拟器设备。
  5. 移除不再需要的模拟器运行时. 运行 xcrun simctl runtime list,再对每个不再测试的运行时运行 xcrun simctl runtime delete 加其标识符;也可以使用 Xcode › Settings › Components。
  6. 最后再检查 Archives. 打开 Window › Organizer › Archives,保留用户可能仍在运行的每个版本的归档。较旧的归档请先拷贝到其他驱动器,再删除。

大多数情况下,可以。DerivedData、iOS DeviceSupport、测试设备克隆、预览模拟器和 Xcode 缓存都可以放心删除:Xcode 在需要时会重新创建它们。模拟器和模拟器运行时同样可以移除,但请使用 Apple 的 simctl 工具,而不是在访达中操作。唯一需要谨慎对待的是 Archives,因为其中保存着你已发布 App 的调试符号。

在用于 iOS 开发的 Mac 上,这些文件夹加起来常常达到几十 GB。下面逐一说明它们是什么,以及最稳妥的移除方法。

Xcode 把数据存在哪里

几乎所有内容都位于个人文件夹下的 ~/Library/Developer 中。模拟器运行时是例外:它们是由 macOS 管理的系统磁盘映像。

文件夹 路径 可以删除吗? 会再出现吗?
DerivedData ~/Library/Developer/Xcode/DerivedData 可以 会,下次构建时
Archives ~/Library/Developer/Xcode/Archives 请先检查 不会
iOS DeviceSupport ~/Library/Developer/Xcode/iOS DeviceSupport 可以 会,连接设备时
模拟器设备 ~/Library/Developer/CoreSimulator/Devices 使用 simctl 在 Xcode 中重新创建
模拟器运行时 /Library/Developer/CoreSimulator/Volumes 使用 simctl 重新下载
测试设备克隆 ~/Library/Developer/XCTestDevices 可以 会,并行测试时
SwiftUI 预览 ~/Library/Developer/Xcode/UserData/Previews 可以 会,运行预览时
模拟器缓存 ~/Library/Developer/CoreSimulator/Caches 可以 会
Xcode 缓存 ~/Library/Caches/com.apple.dt.Xcode 可以 会

旁边的 watchOS DeviceSupport、tvOS DeviceSupport、visionOS DeviceSupport 和 macOS DeviceSupport 文件夹,道理与 DeviceSupport 相同。

~/Library/Developer 下 Xcode 各储存文件夹的示意图,标有“可安全移除”和“请先检查”

DerivedData:可以放心删,Xcode 会重建

DerivedData 保存中间构建产物、源代码索引、构建日志和模块缓存,每个项目一个子文件夹。删除它永远不会碰到你的代码。代价是时间:每个项目的下一次构建都要从头开始,Xcode 还要重新索引,代码补全才能完全恢复。

先退出 Xcode,再把其中的内容移到废纸篓:

open ~/Library/Developer/Xcode/DerivedData

如果只想清理某一个项目,只删除它对应的子文件夹即可(名称为项目名加一串随机后缀)。Xcode 中的 Product › Clean Build Folder 会移除构建产物,但通常保留索引,因此释放的空间更少。你可以在 Xcode › Settings › Locations 中查看或更改这个位置。

Archives:保留已发布的版本

每个 .xcarchive 都是你用 Product › Archive 创建的已签名构建,其中包含 App 的 dSYM 文件。Xcode 借助它们为崩溃报告添加符号名称:如果没有对应的 dSYM,该版本的崩溃报告只会显示内存地址,而不是函数名。第三方崩溃报告工具也需要这些文件。

所以,请逐个检查归档,而不是清空整个文件夹。在 Window › Organizer › Archives 中,删除已经没有用户运行的版本,例如旧的内部测试版。对于仍在 App Store 或 TestFlight 上的版本,请保留归档,或先把 .xcarchive 包拷贝到外置驱动器,再从 Mac 上移除。

iOS DeviceSupport:可以放心删,需要时会再次拷贝

当你连接 iPhone、iPad、Apple Watch、Apple TV 或 Vision Pro 进行开发时,Xcode 会拷贝这台设备的系统符号,以便在 Mac 上调试和符号化。较新的 Xcode 会以设备型号、系统版本和构建号为每个文件夹命名,例如 iPhone15,5 27.0.1 (24A446),单个文件夹往往就有好几 GB。

你调试的每台设备每做一次 iOS 更新,就会多出一个新文件夹,而 Xcode 不会删除旧的。不再运行的系统版本对应的文件夹,可以放心移到废纸篓。如果删掉了仍需要的文件夹,下次连接这台设备时 Xcode 会再次拷贝,大约需要几分钟。

模拟器:设备和运行时是两回事

模拟器运行时是某个系统版本(例如 iOS 27.1)的完整系统映像,通常有 7–10 GB。模拟器设备则是一份小小的配置加上它自己的数据:已安装的 App、照片和设置。多个设备可以共用一个运行时,因此删除设备释放的是它的数据,删除运行时释放的才是那个大映像。

示意图:一个模拟器运行时被多个模拟器设备共用,以及分别用哪条 simctl 命令移除它们

移除模拟器设备

列出设备,并移除那些已无法与当前安装的运行时配合使用的设备:

xcrun simctl list devices
xcrun simctl delete unavailable

delete unavailable 会移除当前 Xcode 已不再支持的设备,它们通常是旧运行时留下来的。要移除某一个设备,请从列表中复制它的 UDID:xcrun simctl delete <UDID>。你也可以在 Window › Devices and Simulators 中完成这一操作。除非你确实想移除所有模拟器及其数据,否则不要使用 xcrun simctl delete all。删除设备是永久性的;不过你随时可以在 Xcode 中新建一个。

移除模拟器运行时

xcrun simctl runtime list
xcrun simctl runtime delete <identifier>

runtime list 会显示每个已安装映像的版本、标识符和状态,以及总大小。runtime delete 接受标识符(每行中的 UUID),然后卸载并移除该映像。从 Xcode 27 起,delete 还支持用 --dry-run 预览,以及 --notUsedSinceDays <days>、--unusable 和 --outdated 选项。较早的 Xcode 支持的选项更少,请运行 xcrun simctl runtime 查看你的版本支持哪些。

在 Xcode 中,也可以通过 Xcode › Settings › Components(在 Xcode 15 中叫 Platforms)完成同样的操作:选中某个运行时,然后删除。Apple 关于下载和安装其他 Xcode 组件的文档说明了如何把它找回来,包括在“终端”中运行 xcodebuild -downloadPlatform iOS。

不要手动删除 /Library/Developer/CoreSimulator/Volumes 或 /System/Library/AssetsV2 中的运行时文件。较新的 Xcode 把运行时作为系统管理的资源来存储,直接删除文件可能导致运行时仍处于已登记状态,却无法使用。

测试克隆、预览和模拟器缓存

  • XCTestDevices:Xcode 为并行测试创建的克隆。没有测试在运行时,可以放心移到废纸篓。
  • SwiftUI 预览:Xcode 在一组专用模拟器中运行预览。xcrun simctl --set previews delete all 会移除它们;下次运行预览时 Xcode 会重新创建。
  • CoreSimulator 缓存和日志:关闭“模拟器”App 后,~/Library/Developer/CoreSimulator/Caches 和 ~/Library/Logs/CoreSimulator 可以放心清空。

旧版 Xcode、工具链和下载文件

/Applications 中的每个 Xcode 都是一个大型 App,为旧项目保留的测试版或旧版很快就会累积起来。删除之前,先确认命令行工具使用的是哪个 Xcode:

xcode-select -p

保留这个路径指向的那份,以及 CI 任务或旧项目仍然需要的版本。另外看看 ~/Downloads 中有没有 .xip 文件:Xcode 安装完成后,这个压缩包就不再需要了。从 swift.org 下载的其他 Swift 工具链位于 ~/Library/Developer/Toolchains,请保留项目实际选用的那些。

~/Library/Caches/com.apple.dt.Xcode 是 Xcode 自己的缓存,会按需重建。如果你用了很多年 Xcode,可能还会在 ~/Library/Developer/Shared/Documentation/DocSets 中找到很早期的 Xcode 下载的离线文档集;当前版本已经不再使用它们。

推荐的清理顺序

  1. 退出 Xcode 和模拟器。
  2. 删除 DerivedData、XCTestDevices 和预览模拟器。这一步没有风险。
  3. 运行 xcrun simctl delete unavailable。
  4. 移除不再面向的系统版本对应的 DeviceSupport 文件夹和模拟器运行时。
  5. 最后再慎重检查 Archives 和旧版 Xcode。

完成后清倒废纸篓,空间才会真正回来。这些文件夹在 macOS 27 Golden Gate、26 Tahoe、15 Sequoia 和 14 Sonoma 上都一样;可用的 simctl 选项取决于你的 Xcode 版本。

MoreRoom 能帮你做什么

MoreRoom 免费版会扫描 ~/Library/Developer,识别上述每个文件夹,标注“可安全移除”或“请先检查”,并说明它是否会再次出现。DerivedData、DeviceSupport、测试克隆和缓存可以逐项移到废纸篓,并且可以撤销。对于模拟器设备和运行时,MoreRoom 会运行 Apple 自己的 xcrun simctl delete 和 xcrun simctl runtime delete;这些命令是永久性的,并会明确标注。Archives 会被标记为建议保留。

MoreRoom Pro 还提供“收集器”(一次清理多个项目)、目标模式(根据你需要的空间挑选最安全的组合)以及针对不活跃项目的项目休眠。从 MoreRoom 直接把归档转移到外置驱动器的功能即将推出;目前请自行拷贝。

常见问题

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

不会。DerivedData 只包含 Xcode 生成的构建产物、索引和日志。你的源代码和项目设置都保存在项目文件夹中。Xcode 重新生成这些数据期间,下一次构建和索引会花更长时间。

删除 Xcode Archives 安全吗?

只适用于已经没人运行的版本。每个归档都包含 dSYM 文件,可以把崩溃报告中的地址转换成函数名。凡是仍在用户手中的版本,都请保留归档,或先拷贝到其他驱动器。

为什么 iOS DeviceSupport 删了又会出现?

你每连接一台设备进行开发,Xcode 都会从中拷贝调试符号,每种设备型号和系统版本各一份。如果删掉了仍在使用的设备对应的文件夹,下次连接这台设备时,Xcode 会再次拷贝。

可以直接删除 CoreSimulator 文件夹吗?

最好不要。模拟器设备和运行时都登记在 CoreSimulator 服务中,而运行时是挂载的系统磁盘映像。请使用 xcrun simctl delete 和 xcrun simctl runtime delete,或 Xcode 的设置,这样登记信息才能保持一致。

删除的模拟器运行时怎样找回来?

在 Xcode › Settings › Components 中重新下载,或在“终端”中运行 xcodebuild -downloadPlatform iOS。之后可以在 Window › Devices and Simulators 中重新创建模拟器设备。

本指南提到的文件夹