AskCleanAskClean问净

如何安全删除旧 Xcode Archives,又不丢失崩溃符号

AskClean 团队 · 更新于 2026-07-31

只有在确认某份 Xcode Archive 对应的 App 版本已停止分发、以后也不再需要它的 dSYM 分析崩溃时,才应该删除。最稳妥的办法是在 Xcode Organizer 中逐个检查,保留所有仍在线的 App Store、TestFlight、企业或 Ad Hoc 构建,仅把确定退役的归档移到废纸篓。

Xcode 归档被分成受保护的当前版本与可以审查清理的退役版本
Archive 是发布证据,不是普通缓存:当前版本要保护,退役版本要逐个审核。

为什么 Archives 不能当成 DerivedData 来删

每次执行 Product > Archive,Xcode 都会生成一份用于分发的构建,并保存为 .xcarchive 包。它们默认位于 ~/Library/Developer/Xcode/Archives,按日期分组,同时出现在 Organizer 中。一个长期维护的 App,经过多轮候选版本、TestFlight 和正式发布后,很容易积累几十份归档。

DerivedData 是从源代码重新生成的构建缓存,Archive 却可能保存着那一次发布的精确二进制、构建元数据和 dSYM。Apple 说明,dSYM 通过 UUID 与某个二进制一一对应。以后即使拿同一个 commit 重新构建,新产物也会拥有不同的标识,无法替代原来的符号文件。

所以二者的删除代价完全不同。删 DerivedData,代价只是下次完整编译和重新索引;删错 Archive,则可能永远无法恢复那一版的调试信息。等线上崩溃报告到来时,调用栈里只剩内存地址,无法还原成函数名和源码位置。

删除前,先做一份保留清单

先从 Xcode 入手,不要只看访达里的日期文件夹。打开 Window > Organizer,选择 Archives,再选中对应 App。逐份查看版本号、Build 号、创建时间和分发状态;这些上下文比一个看起来很旧的文件夹名称可靠得多。

先决定什么必须保留,再决定什么可以删除。仍在 App Store 面向用户的版本、仍在测试的 TestFlight 构建、尚未过期的企业或 Ad Hoc 构建,以及仍处于崩溃分析窗口内的历史正式版,都应该保留。如果团队还会重新导出安装包、核对签名或依赖某份已验证的发布产物,也要把它列入保留清单。

不要因为上传成功就默认本地 Archive 没用了。根据平台和上传设置,Apple 可能已经收到符号文件,但 Apple 的调试文档仍建议保留每一份已分发构建的归档。本地 Archive 也是把二进制、dSYM、版本号、Build 号和导出记录连在一起的最清晰凭证。

  1. 打开 Window > Organizer,进入 Archives。
  2. 按 App 整理当前正式版、TestFlight、企业和 Ad Hoc 构建的版本号与 Build 号。
  3. 确认需要上传的符号已经上传;如果团队有归档制度,把不可替代的版本复制到有备份的存储。
  4. 只把被正式版取代的候选构建、已放弃的内部版本,以及超出崩溃分析周期的退役版本标记为候选。
  5. 在 Organizer 中逐个删除,重新核对保留项无误后,再考虑清空废纸篓。

不能只按日期决定去留。旧正式版可能在新版本上线很久后,仍安装在部分用户设备上。

先测量,不要一上来就删

如果目标是回收磁盘空间,先量出 Archives 到底占了多少。在访达按 Command-Shift-G,打开 ~/Library/Developer/Xcode/Archives,切到列表视图,在「显示选项」中启用「计算所有大小」,再按大小排序。整个过程只读,不会修改任何文件。

习惯终端的话,可以运行 du -sh ~/Library/Developer/Xcode/Archives 查看总量;用 du -sh ~/Library/Developer/Xcode/Archives/* 查看各日期目录。它们只负责测量,不会删除内容。

.xcarchive 在访达里是一个包。排查体积时,可以对复制出来的归档使用「显示包内容」,但不要从正式归档内部随意抽走文件。一个残缺的 Archive 可能还显示在那里,却已经无法正常导出或进行符号化。

最稳妥的删除流程

首选 Organizer,因为执行删除时,版本号、Build 号和 App 身份都摆在眼前。选中已经确认退役的归档,再使用 Delete。相比在访达里辨认日期文件夹,这一步更不容易删错对象。

只有在 Organizer 无法读取某个很老或已经损坏的包时,才退回访达。找到具体的 .xcarchive,核对 Info.plist 中的版本和构建信息与审核记录一致,然后只把这一份移到废纸篓。不要因为某个日期很早,就整个日期目录删除。

先别急着清空废纸篓。重新打开 Organizer,确认需要的版本仍在;如果符号化对业务很关键,再拿一份代表性崩溃报告做验证。移到废纸篓至少留下了一段恢复窗口,而终端永久删除并不会让判断变得更正确。

建立不会无限增长的归档策略

好的保留规则以发布状态为核心,而不是简单规定「超过 90 天就删」。仍在分发的全部保留;已经下架但仍接收崩溃报告的正式版,在支持周期内保留;企业构建至少保留到安装失效;法律、审计、重大事故复盘要求的里程碑版本按制度长期保存。

团队最好把它写进发布清单:Archive 存在哪里、dSYM 是否已上传、谁有权限取回、什么时候进入可删除状态。如果把归档迁到外置盘或云存储,必须真正测试一次恢复和导出,不能只确认文件「看起来复制成功」。

每个大版本发布结束后做一次十分钟审核,比启动盘爆满时仓促扫荡安全得多。急需空间时,先清 DerivedData 和失效模拟器;等 Mac 恢复足够工作空间,再冷静审查 Archives。

AskClean 如何处理 Xcode Archives

AskClean 不会把 Archives 标成普通的可重建缓存。它会扫描归档目录,逐个列出 .xcarchive,并显示「不可恢复」的代价提示,让你审核某一份旧构建,而不是面对「整个文件夹全删或全留」的粗暴选择。

最终判断仍然属于你。AskClean 可以告诉你哪份归档占空间、把你批准的项目移到废纸篓,但它不可能替你知道产品的线上支持周期,也无法补回已经丢失的 dSYM。这条边界是刻意设计的:清理工具应该揭示发布产物,而不是擅自宣布它已经没用了。

删除边界:哪些能重建,哪些不能

先判断恢复代价,再考虑文件年龄和体积。

项目默认位置删除后果
DerivedData~/Library/Developer/Xcode/DerivedData可以从源码重建;下次构建和索引会更慢。
Xcode Archive~/Library/Developer/Xcode/Archives可能一并删除已保存的二进制、元数据和匹配 dSYM。
单独导出的 dSYM团队的发布产物存储可能是某个已分发二进制仅存的符号文件。
已退役内部构建~/Library/Developer/Xcode/Archives确认不再安装、不再支持后,才适合进入删除候选。

常见问题

可以把 ~/Library/Developer/Xcode/Archives 整个删掉吗?

不能把它当成安全的批量操作。归档可能包含线上构建对应的精确二进制和 dSYM。仍在分发、仍在测试或仍可能收到崩溃报告的版本都要保留。

删除本地 Archive 会把 App 从 App Store 下架吗?

不会。删除本地 .xcarchive 不会影响已经上传到 App Store Connect 的版本,也不会删除用户设备上的 App;它删除的是你自己的发布产物和潜在调试依据。

重新构建同一个 commit,能生成一样的 dSYM 吗?

不能把它当成可靠替代。dSYM 必须匹配已分发二进制的 UUID,新构建会产生不同的二进制身份,所以应该保存原始归档或对应符号。

需要空间时,应该先删 Archive 还是 DerivedData?

通常先删 DerivedData。它可以从源代码重建,风险更低;Archive 必须按发布版本逐个审核,删错后可能失去不可恢复的调试证据。

参考来源

继续检查 Xcode 存储