Mọi bài viết

Hướng dẫn

Cách xóa DerivedData Xcode, giải phóng dung lượng Mac

Tác giả Nguyen Truong Duy · · 8 phút đọc

Để xóa DerivedData của Xcode, hãy thoát Xcode rồi xóa toàn bộ nội dung thư mục ~/Library/Developer/Xcode/DerivedData, bằng Finder (mở từ Xcode ▸ Settings ▸ Locations) hoặc bằng lệnh rm -rf ~/Library/Developer/Xcode/DerivedData/* trong Terminal. Việc này an toàn: Xcode sẽ tạo lại mọi thứ ở lần build sau, chỉ chậm hơn một lần.

Nhưng DerivedData hiếm khi là thủ phạm duy nhất làm đầy ổ. Simulator, file device support và các bản archive cũ thường còn nặng hơn. Bài này chỉ ra từng thứ nằm ở đâu, cái nào xóa được, và xóa thế nào.

Xem dung lượng đang đi đâu

Chạy lệnh sau trong Terminal để xem kích thước từng thư mục của Xcode trong thư mục người dùng:

du -sh ~/Library/Developer/Xcode/* ~/Library/Developer/CoreSimulator/* 2>/dev/null | sort -h

Một máy Mac làm iOS được một hai năm thường có vài chục GB ở đây. Các thư mục chính:

Là gì Nằm ở Xóa được không?
DerivedData (sản phẩm build, index, module cache) ~/Library/Developer/Xcode/DerivedData Được. Tạo lại ở lần build sau.
Cache của simulator ~/Library/Developer/CoreSimulator/Caches Được. Tạo lại khi cần.
Device support ~/Library/Developer/Xcode/iOS DeviceSupport (và watchOS, tvOS, visionOS DeviceSupport) Được. Xcode chép lại khi bạn cắm thiết bị chạy phiên bản iOS đó.
Các simulator (app và dữ liệu trong từng máy ảo) ~/Library/Developer/CoreSimulator/Devices Dùng simctl hoặc Xcode, đừng xóa bằng Finder. Xóa simulator là mất dữ liệu app trong đó.
Simulator runtime (mỗi phiên bản hệ điều hành một cái) File ảnh đĩa nằm ngoài thư mục người dùng, quản lý ở Xcode ▸ Settings ▸ Components Được, nếu bạn không còn test trên phiên bản đó. Có thể tải lại.
Archives ~/Library/Developer/Xcode/Archives Cẩn thận. Giữ archive của mọi bản đã phát hành.

Lệnh du ở trên không tính simulator runtime. Các bản Xcode gần đây lưu chúng dưới dạng file ảnh đĩa trong thư mục hệ thống (/Library/Developer/CoreSimulator hoặc /System/Library/AssetsV2), nên hãy chạy xcrun simctl runtime list để xem chúng kèm tổng dung lượng.

Xóa DerivedData

Bằng Xcode

Xcode chỉ có giao diện tiếng Anh, nên tên menu bên dưới giữ nguyên.

  1. Dừng các bản build đang chạy, chọn Xcode ▸ Settings (⌘,) rồi bấm Locations.
  2. Cạnh dòng Derived Data, bấm mũi tên nhỏ để mở thư mục trong Finder.
  3. Thoát Xcode rồi xóa các thư mục bên trong. Mỗi dự án có một thư mục riêng, đặt theo tên dự án kèm một chuỗi mã, nên bạn có thể chỉ xóa đúng dự án đang lỗi.

Xcode ▸ Settings ▸ Locations với đường dẫn Derived Data và nút mũi tên

Product ▸ Clean Build Folder (Shift-Command-K) không giống vậy. Lệnh này chỉ xóa sản phẩm build của dự án đang mở, giữ nguyên index và DerivedData của các dự án khác. Nên thử nó đầu tiên khi gặp lỗi build lạ, nhưng nó không giải phóng được bao nhiêu dung lượng.

Bằng Terminal

rm -rf ~/Library/Developer/Xcode/DerivedData/*

Thoát Xcode trước: nếu Xcode đang mở, nó sẽ ghi lại index ngay. rm -rf không đi qua Thùng rác (Trash), nên dung lượng được trả lại ngay lập tức. Hãy kiểm tra kỹ đường dẫn trước khi nhấn Return.

Xóa simulator và runtime cũ

Mỗi simulator là một thiết bị đầy đủ với app và dữ liệu riêng, còn mỗi simulator runtime (iOS 17, iOS 18, iOS 26…) chiếm vài GB. Sau vài lần cập nhật Xcode, nhiều simulator trỏ tới runtime không còn tồn tại.

Xóa các simulator đã mất runtime:

xcrun simctl delete unavailable

Lệnh này chỉ xóa những thiết bị Xcode vốn không dùng được nữa, không đụng tới runtime. Xem những gì còn lại bằng xcrun simctl list devices. Muốn xóa một simulator không cần nữa, vào Window ▸ Devices and Simulators ▸ Simulators (chuột phải ▸ Delete) hoặc dùng xcrun simctl delete <UDID>.

Runtime được quản lý trong Xcode ▸ Settings ▸ Components. Xcode liệt kê các nền tảng và simulator runtime đã cài, kèm dung lượng lấy lại được. Bấm nút thông tin cạnh runtime và chọn Delete. Xcode 14 và 15 gọi mục này là Platforms; từ Xcode 16 nó được đổi tên thành Components. Trong Terminal:

xcrun simctl runtime list
xcrun simctl runtime delete <mã runtime>

Xóa runtime khiến các simulator của nó không dùng được, nên hãy chạy lại xcrun simctl delete unavailable sau đó.

Xóa file device support

Mỗi lần bạn cắm iPhone, iPad, Apple Watch hay Apple TV chạy một phiên bản hệ điều hành mới, Xcode chép debug symbol của phiên bản đó vào ~/Library/Developer/Xcode/iOS DeviceSupport (hoặc thư mục tương ứng cho watchOS, tvOS, visionOS). Điều này vẫn đúng với thiết bị chạy iOS 17 trở lên. Các thư mục đặt tên theo phiên bản và số build (một số có thêm tên mẫu thiết bị ở đầu), mỗi cái có thể vài GB.

Xóa thư mục của những phiên bản mà thiết bị của bạn không còn chạy. Lỡ xóa nhầm cái còn cần thì Xcode sẽ chép lại khi bạn cắm thiết bị đó, mất vài phút.

Cẩn thận với Archives

~/Library/Developer/Xcode/Archives chứa mọi bản build bạn tạo bằng Product ▸ Archive. Mỗi archive có app và file dSYM, tức debug symbol giúp biến crash report thành tên hàm và số dòng đọc được. Nếu xóa archive của phiên bản người dùng vẫn đang chạy, crash report của phiên bản đó (trong Organizer của Xcode hay dịch vụ báo lỗi) sẽ không symbolicate được nữa.

Từ khi Xcode 14 bỏ bitcode, App Store Connect không còn cho tải dSYM của các bản build mới. Nếu bạn chưa tải dSYM lên một dịch vụ báo lỗi, archive trên máy nhiều khả năng là bản duy nhất.

Vì vậy:

  • Giữ archive của mọi bản đã phát hành, ít nhất khi phiên bản đó còn người dùng.
  • Xóa archive của các bản build thử và các phiên bản không còn ai dùng.
  • Để xóa, vào Window ▸ Organizer ▸ Archives, chọn archive rồi nhấn Delete, để thấy rõ tên app, phiên bản và ngày. Hoặc sao lưu dSYM trước: chuột phải vào archive ▸ Show in Finder, rồi chuột phải vào file .xcarchive ▸ Hiển thị nội dung gói (Show Package Contents) ▸ dSYMs.

Cách có sẵn đã đủ chưa?

Để dọn một lần thì đủ. Xcode và Terminal làm được tất cả, và với simulator, runtime và archive thì đó là công cụ phù hợp nhất, vì chúng biết từng thứ là gì.

Vấn đề là dữ liệu này sẽ lại phình ra, và Xcode không phải thứ duy nhất làm đầy ~/Library. Cache của app, log, cache npm và Gradle, file cài đặt cũ trong Tải về (Downloads) cũng chồng chất, mỗi thứ một thư mục.

Cách nhanh hơn: Macsential Free Up Space

Macsential là ứng dụng Mac native gom các công cụ dùng hằng ngày. Công cụ Free Up Space của nó cho thấy các thư mục trên đang chứa bao nhiêu trong một danh sách, và dọn những mục bạn đánh dấu.

Free Up Space của Macsential sau khi quét, liệt kê Xcode build data, Developer package caches và Xcode device support kèm dung lượng

Giao diện ứng dụng bằng tiếng Anh. Bấm Scan, ứng dụng sẽ đo:

  • Xcode build data: DerivedData và cache simulator (CoreSimulator/Caches). Được chọn sẵn. Xóa vĩnh viễn, vì Xcode tạo lại được.
  • Xcode device support: các thư mục DeviceSupport của iOS, watchOS, tvOS và visionOS. Không chọn sẵn, vì Xcode phải chép lại lần sau bạn cắm thiết bị. Xóa vĩnh viễn.
  • Developer package caches: cache tải về của npm, Bun, pnpm, Gradle và Cargo. Các gói sẽ được tải lại khi cần.
  • Cache của app và log trong thư mục Library, file cài đặt trong Downloads (ảnh đĩa và gói cài), bản sao lưu iPhone và iPad, và Thùng rác.
  • File lớn trên 500 MB trong thư mục người dùng, ngoài ~/Library và các thư mục ẩn, để bạn tìm ra bản quay màn hình hay file máy ảo đã quên.

Điều nó không làm cũng quan trọng: nó không bao giờ đụng tới Archives, simulator hay runtime. Hãy dùng Organizer và mục Components của Xcode như trên, vì chỉ bạn biết bản build nào đã phát hành.

Trước khi xóa, hộp xác nhận cho biết bao nhiêu sẽ bị xóa vĩnh viễn và bao nhiêu được chuyển vào Thùng rác. Cache, log và dữ liệu build bị xóa. File của chính bạn (file cài đặt, bản sao lưu thiết bị, file lớn) được chuyển vào Thùng rác, nên vẫn lấy lại được. Mỗi dòng có nút Show in Finder để xem trước. Hãy thoát Xcode trước khi dọn, như khi dùng Terminal.

Nếu có thư mục không đọc được, Free Up Space sẽ báo và dẫn tới Truy cập ổ đĩa đầy đủ (Full Disk Access) trong Cài đặt hệ thống (System Settings). Mọi thứ diễn ra trên máy Mac của bạn.

Free Up Space đi cùng quay màn hình, chụp màn hình, chuyển đổi ảnh và video, và quản lý cửa sổ trong một ứng dụng. Xem giá hoặc tải Macsential. Nếu bạn tò mò một tiện ích Swift native như thế này được làm ra sao, bài devlog về trình quay màn hình (tiếng Anh) kể chi tiết.

Câu hỏi thường gặp

Xóa DerivedData có an toàn không?

Có. Thư mục này chỉ chứa những thứ Xcode tự tạo: sản phẩm build, index code và module cache. Mã nguồn và cài đặt dự án nằm ở chỗ khác. Lần build và index tiếp theo chỉ lâu hơn một lần.

Vì sao Xcode chiếm nhiều dung lượng vậy?

Bản thân Xcode đã lớn, nhưng phần phình ra là dữ liệu xung quanh: mỗi phiên bản hệ điều hành một simulator runtime, mỗi phiên bản trên thiết bị một thư mục device support, mỗi lần phát hành một archive, và DerivedData cho mọi dự án bạn từng mở. Trong Cài đặt hệ thống ▸ Cài đặt chung ▸ Dung lượng (System Settings ▸ General ▸ Storage), phần lớn số này nằm ở mục Nhà phát triển (Developer), với các mục như Bộ nhớ đệm Xcode, Chỉ mục và dữ liệu tạo dự án, Bản lưu trữ dự án (archive), Hỗ trợ thiết bị và Hỗ trợ trình mô phỏng, kèm dung lượng từng mục. Phần còn lại được tính vào Dữ liệu hệ thống (System Data). Hãy cẩn thận với các archive ở đây như trong Organizer.

Bao lâu nên xóa DerivedData một lần?

Không cần theo lịch. Xóa khi ổ sắp đầy, khi build hoặc index chạy bất thường mà Clean Build Folder không giúp được, hoặc khi đã xong một dự án.

Có xóa được Archives cũ của Xcode không?

Được, nhưng hãy giữ archive (hoặc ít nhất là dSYM) của mọi phiên bản người dùng còn chạy. Thiếu chúng, crash report của phiên bản đó không symbolicate được.