AskClean

Cách xóa Xcode DerivedData và bộ nhớ đệm lập trình an toàn

Đội ngũ AskClean · Cập nhật 2026-11-02

DerivedData là thư mục làm việc tạm của Xcode, chứa sản phẩm build và chỉ mục, và có thể âm thầm phình lên hàng chục gigabyte. Bạn có thể xóa nó an toàn: thoát Xcode, xóa nội dung trong ~/Library/Developer/Xcode/DerivedData, và Xcode sẽ tạo lại mọi thứ ở lần build tiếp theo. Bài này hướng dẫn việc đó, cùng cách dọn trình giả lập, Archives và bộ nhớ đệm của trình quản lý gói.

Cách xóa Xcode DerivedData và bộ nhớ đệm lập trình an toàn
Cách xóa Xcode DerivedData an toàn, gỡ runtime trình giả lập cũ và dọn Archives, tệp DeviceSupport cùng bộ nhớ đệm của trình quản lý gói trên máy Mac.

DerivedData là gì và vì sao nó phình to

DerivedData là nơi Xcode lưu mọi thứ được tạo ra từ mã nguồn của bạn: đối tượng build trung gian, sản phẩm đã biên dịch, bộ nhớ đệm module, chỉ mục ký hiệu phục vụ gợi ý mã và chuyển đến định nghĩa, cùng nhật ký build. Mặc định thư mục này nằm ở ~/Library/Developer/Xcode/DerivedData, với một thư mục con cho mỗi dự án hoặc workspace bạn từng mở.

Nó phình to vì một lý do mang tính cấu trúc: Xcode tạo một thư mục DerivedData cho mọi dự án bạn mở — kể cả những bản clone chỉ build một lần rồi bỏ đó — và không tự xóa chúng. Mỗi thư mục giữ sản phẩm build riêng cho từng cấu hình và đích build (Debug và Release, trình giả lập và thiết bị thật), vì vậy hãy đo từng thư mục con của dự án thay vì đoán xem máy sẽ lấy lại được bao nhiêu dung lượng.

Mọi thứ trong đó đều tạo lại được — đó chính là ý nghĩa của chữ “derived” (dẫn xuất). Xóa DerivedData không bao giờ đụng đến mã nguồn, thiết lập dự án hay bất cứ thứ gì nằm trong hệ thống quản lý phiên bản. Cái giá duy nhất là thời gian: lần build tiếp theo của mỗi dự án sẽ là build sạch từ đầu, và Xcode sẽ lập chỉ mục lại ở chế độ nền trong vài phút.

Xóa DerivedData

Lệnh Clean Build Folder của Xcode (Product > Clean Build Folder, hoặc Shift-Command-K) chỉ dọn sản phẩm build của dự án đang mở — hữu ích khi cần sửa một bản build trục trặc, nhưng gần như không giải phóng thêm dung lượng. Muốn lấy lại dung lượng thật sự, hãy xóa chính các thư mục DerivedData: mở chúng từ phần cài đặt Locations của Xcode hoặc đi tới thư mục đó trong Finder, hoặc xóa bằng Terminal. Cả ba cách đều cho cùng một kết quả.

Xóa theo từng dự án là cách có chọn lọc: giữ DerivedData của hai, ba dự án bạn build hằng ngày và xóa thư mục của mọi dự án còn lại. Xóa toàn bộ là cách nhanh nhất và cũng không sao — bạn chỉ phải chịu chi phí build lại từ đầu cho mọi dự án cùng lúc.

  1. Thoát Xcode trước. Xóa DerivedData khi Xcode đang chạy có thể làm trình lập chỉ mục bị rối, và những tệp Xcode đang mở có thể không xóa sạch được.
  2. Tìm thư mục: trong Xcode, mở Settings > Locations rồi bấm vào mũi tên nhỏ cạnh đường dẫn DerivedData để hiện thư mục trong Finder. Hoặc trong Finder, nhấn Command-Shift-G và nhập trực tiếp ~/Library/Developer/Xcode/DerivedData.
  3. Sắp xếp các thư mục con theo kích thước, chọn những thư mục muốn xóa (hoặc nhấn Command-A để chọn tất cả) rồi chuyển vào Thùng rác. Chuyển vào Thùng rác trước là thói quen an toàn hơn — nếu đổi ý, bạn có thể khôi phục ngay.
  4. Hoặc dùng Terminal: rm -rf ~/Library/Developer/Xcode/DerivedData xóa toàn bộ chỉ bằng một lệnh. Cách này nhanh hơn Finder với các thư mục rất lớn, nhưng hãy đọc ghi chú bên dưới trước khi dùng.
  5. Mở lại Xcode và build. Lần build đầu tiên của mỗi dự án sẽ lâu hơn thấy rõ, và “Indexing” sẽ chạy trên thanh hoạt động một lúc — cả hai chỉ là chi phí một lần.

Cẩn thận với rm -rf: lệnh này bỏ qua Thùng rác và xóa vĩnh viễn, không thể hoàn tác. Hãy gõ đường dẫn thật chính xác, đừng bao giờ chạy kèm sudo cho việc này, và nếu chưa quen Terminal, hãy dùng Finder — cách này làm được đúng việc đó mà vẫn khôi phục được.

Dọn runtime trình giả lập cũ

Trình giả lập (Simulator) thường cũng là một nhóm dữ liệu lập trình lớn. Mỗi runtime iOS, watchOS hoặc tvOS đã tải về đều chiếm dung lượng riêng, và mỗi thiết bị giả lập lưu dữ liệu trong ~/Library/Developer/CoreSimulator/Devices. Nếu đã qua vài lần nâng cấp Xcode, hãy kiểm tra runtime của những phiên bản hệ điều hành không còn nằm trong danh sách bạn kiểm thử.

Cách nhanh nhất là lệnh dọn dẹp có sẵn: chạy xcrun simctl delete unavailable trong Terminal. Lệnh này xóa mọi thiết bị giả lập được đánh dấu unavailable (không khả dụng) — phần lớn là thiết bị mồ côi do runtime đã gỡ và các phiên bản Xcode cũ để lại — cùng toàn bộ ứng dụng và dữ liệu bên trong. Hãy xem danh sách bằng xcrun simctl list devices trước, nhất là khi bạn cài nhiều phiên bản Xcode.

Với chính các runtime, mở Settings > Components trong Xcode (trong Xcode 14–15 gọi là Platforms). Bạn sẽ thấy từng runtime trình giả lập đã cài kèm kích thước; chọn một runtime cũ và xóa. Chỉ giữ runtime mới nhất cho mỗi nền tảng, trừ khi bạn thực sự còn kiểm thử trên các phiên bản hệ điều hành cũ.

Bạn cũng có thể xóa bớt từng thiết bị giả lập trong Window > Devices and Simulators: chuyển sang tab Simulators, bấm chuột phải vào thiết bị bạn không bao giờ dùng — chẳng hạn sáu mẫu iPhone trùng nhau còn dữ liệu từ những lần chạy thử cũ — rồi chọn Delete. Dữ liệu và ứng dụng đã lưu trên thiết bị đó sẽ bị xóa theo.

Archives, tệp DeviceSupport và bộ nhớ đệm

Archives tích tụ ở ~/Library/Developer/Xcode/Archives mỗi lần bạn chạy Product > Archive để phân phối một bản build. Mỗi archive chứa trọn một bản build ứng dụng cùng ký hiệu gỡ lỗi dSYM, thường từ 100 MB đến 1 GB mỗi bản. Trước khi xóa, hãy hiểu điều phải đánh đổi: chính các dSYM bên trong giúp bạn giải mã (symbolicate) báo cáo sự cố của đúng bản build đó. Hãy giữ archive của những phiên bản còn đang phát hành trên App Store hoặc TestFlight (hoặc xác nhận App Store Connect đã có dSYM), rồi xóa phần còn lại — cách an toàn nhất là dùng Organizer của Xcode (Window > Organizer > Archives), nơi bạn xem và xóa từng bản với đầy đủ thông tin.

iOS DeviceSupport, nằm ở ~/Library/Developer/Xcode/iOS DeviceSupport, chứa ký hiệu gỡ lỗi mà Xcode sao chép từ mọi iPhone hoặc iPad thật bạn từng kết nối — mỗi phiên bản iOS một thư mục, thường 2–5 GB mỗi thư mục. Thư mục của những phiên bản iOS mà không thiết bị nào của bạn còn chạy chỉ chiếm chỗ vô ích: cứ xóa, và nếu sau này bạn kết nối lại một thiết bị chạy phiên bản đó, Xcode sẽ tự sao chép lại ký hiệu (bạn sẽ thấy “Preparing debugger support” một lần). Thiết bị watchOS và tvOS cũng có các thư mục tương tự nằm ngay bên cạnh.

Xcode còn giữ bộ nhớ đệm riêng trong ~/Library/Caches/com.apple.dt.Xcode, còn trình giả lập giữ bộ nhớ đệm trong ~/Library/Developer/CoreSimulator/Caches. Cả hai đều được tạo lại khi cần, nhưng chỉ dọn khi Xcode và ứng dụng Simulator đã thoát, và đừng đụng đến những tệp bộ nhớ đệm CoreSimulator mà bạn không nhận ra.

Bộ nhớ đệm của trình quản lý gói (SwiftPM, CocoaPods, npm, Homebrew)

Trình quản lý gói giữ lại các phần phụ thuộc đã tải về để những lần cài sau nhanh hơn. Điều đó hữu ích, nhưng trên một chiếc máy đã qua nhiều năm dự án, các bộ nhớ đệm này vẫn có thể chiếm một phần dung lượng đáng kể. Chúng tạo lại được, nhưng lần cài tiếp theo sẽ phải tải gói về lại.

Swift Package Manager lưu các gói đã tải trong ~/Library/Caches/org.swift.swiftpm, còn các bản checkout đã phân giải của từng dự án nằm trong thư mục DerivedData của dự án đó — nên dọn DerivedData là đã dọn luôn phần này. Bộ nhớ đệm dùng chung có thể xóa trong Finder hoặc bằng rm -rf với đúng đường dẫn đó.

CocoaPods lưu các pod đã tải trong ~/Library/Caches/CocoaPods. Cách gọn gàng để làm trống là dùng lệnh có sẵn: pod cache clean --all. Thư mục Pods của các dự án vẫn nguyên vẹn; chỉ bộ nhớ đệm tải về bị xóa.

Bộ nhớ đệm của npm nằm ở ~/.npm và có thể lên tới nhiều gigabyte trên máy làm nhiều JavaScript. Chạy npm cache clean --force để làm trống (npm bắt buộc có cờ này vì bộ nhớ đệm tự phục hồi và bình thường không cần dọn; xóa nó vẫn an toàn — các gói chỉ đơn giản được tải lại ở lần cài tiếp theo). Nếu dùng pnpm, hãy chạy pnpm store prune.

Homebrew tích trữ các tệp tải về cũ và phiên bản gói lỗi thời. brew cleanup xóa phiên bản lỗi thời và tệp tải về cũ, và khi chạy cho toàn bộ (không nêu tên gói), lệnh này còn gỡ cài đặt những phần phụ thuộc không còn gói nào cần đến (trừ khi đã đặt HOMEBREW_NO_AUTOREMOVE); brew cleanup --prune=all còn làm trống toàn bộ bộ nhớ đệm tải về. Hãy chạy brew cleanup -n trước nếu muốn xem thử danh sách những gì sẽ bị xóa.

Tự động hóa việc dọn dẹp

Tất cả các bước trên đều hiệu quả, nhưng dọn rác lập trình là việc không bao giờ xong: DerivedData quay lại chỉ sau một tuần làm việc bình thường, bộ nhớ đệm lại đầy, và mỗi bản cập nhật Xcode lại bỏ lại thêm một runtime. Nếu bạn không muốn tháng nào cũng lặp lại sáu quy trình thủ công, đây là phần đáng tự động hóa — bằng một công cụ giải thích rõ lý do thay vì âm thầm xóa hàng loạt.

AskClean coi tệp lập trình là những danh mục riêng: một lần quét liệt kê chi tiết Xcode DerivedData theo từng dự án, runtime trình giả lập cũ (đọc qua simctl, giữ bản mới nhất cho mỗi nền tảng), tệp DeviceSupport, cùng bộ nhớ đệm của các trình quản lý gói như npm, SwiftPM, cargo, uv và nhiều công cụ khác. Ứng dụng cũng phát hiện những thứ ngốn dung lượng mới hơn — mô hình AI cục bộ — liệt kê từng mô hình Hugging Face và toàn bộ thư viện mô hình Ollama dưới dạng một mục duy nhất, tất cả đều không được chọn sẵn.

Mỗi mục đều kèm lời giải thích — đó là gì, có tạo lại được không, xóa thì mất gì — và không có gì bị xóa cho đến khi bạn xác nhận. Các mục đã xác nhận sẽ bị xóa vĩnh viễn chứ không chuyển vào Thùng rác, vì vậy hãy xem lại từng lựa chọn trước khi xác nhận; mã nguồn và thư viện ảnh của bạn không bao giờ bị đụng đến. Đó chính là danh sách kiểm tra trong bài này, chỉ bớt đi một tiếng đồng hồ gõ lệnh trong Terminal.

Thứ gì tạo lại được, thứ gì không

Đây là bảng ranh giới xóa, không phải cam kết về dung lượng tiết kiệm được. Hãy đo máy Mac của bạn trước và sau mỗi thao tác — tập lệnh kiểm tra chỉ đọc trong hướng dẫn về dung lượng trình giả lập Xcode sẽ báo cáo các thư mục này mà không thay đổi gì.

Danh mụcVị trí mặc địnhHệ quả khi xóa
DerivedData~/Library/Developer/Xcode/DerivedDataĐược build và lập chỉ mục lại; mã nguồn và lịch sử Git không bị ảnh hưởng.
Thiết bị giả lập~/Library/Developer/CoreSimulator/DevicesMất ứng dụng và dữ liệu kiểm thử của thiết bị ảo đã chọn; hãy xóa bằng simctl hoặc Xcode.
Archives~/Library/Developer/Xcode/ArchivesCó thể mất dSYM cần để giải mã báo cáo sự cố; hãy xem xét trong Organizer trước.
DeviceSupport~/Library/Developer/Xcode/iOS DeviceSupportKý hiệu gỡ lỗi sẽ được sao chép lại nếu thiết bị chạy phiên bản hệ điều hành đó kết nối lại.

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

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

Có — đây là một trong những lần xóa dung lượng lớn an toàn nhất trên Mac. DerivedData chỉ chứa các tệp Xcode tạo ra từ mã nguồn của bạn: sản phẩm build, bộ nhớ đệm module, chỉ mục và nhật ký. Mã nguồn, tệp dự án và lịch sử Git nằm ở nơi khác và không bao giờ bị ảnh hưởng. Hệ quả duy nhất là lần build tiếp theo của mỗi dự án phải build lại từ đầu và Xcode phải lập chỉ mục lại.

Bao lâu nên dọn DerivedData một lần?

Không có lịch cố định — hãy dọn khi nó đủ lớn để đáng bận tâm; với phần lớn lập trình viên làm việc thường xuyên, khoảng một đến hai tháng một lần. Có hai thời điểm luôn nên dọn: khi bạn cần dung lượng gấp, và khi một dự án báo lỗi build khó hiểu hoặc gợi ý mã không còn khớp với mã nguồn — lúc đó xóa DerivedData là cách xử lý đầu tiên quen thuộc.

Xcode có chậm hơn sau khi xóa DerivedData không?

Có, nhưng chỉ tạm thời. Lần build đầu tiên của mỗi dự án là build sạch, có thể lâu gấp nhiều lần so với build tăng dần, và việc lập chỉ mục ở chế độ nền cần vài phút trước khi gợi ý mã và tìm kiếm hoạt động trở lại đầy đủ. Sau lượt đầu đó, hiệu năng trở lại như cũ — DerivedData chỉ chứa bộ nhớ đệm, không phải những tối ưu mà bạn mất vĩnh viễn.

Còn ~/Library/Developer/CoreSimulator thì sao — có xóa được không?

Đừng xóa mù quáng — thư mục này chứa các thiết bị giả lập đang cài cùng dữ liệu của chúng, và xóa cả thư mục sẽ khiến chúng hỏng cho đến khi bạn cài lại runtime. Thay vào đó, hãy dọn đúng cách: chạy xcrun simctl delete unavailable cho các thiết bị mồ côi (ứng dụng và dữ liệu của chúng cũng bị xóa theo), gỡ runtime cũ trong Settings > Components của Xcode, xóa thiết bị không dùng trong Devices and Simulators, và chỉ tự tay dọn thư mục con Caches khi Xcode và Simulator đã thoát.

Clean Build Folder có làm việc tương tự không?

Không. Product > Clean Build Folder (Shift-Command-K) chỉ dọn sản phẩm build của dự án hiện tại, còn giữ nguyên chỉ mục, bộ nhớ đệm module và thư mục của mọi dự án khác. Đó là công cụ gỡ rối khi build lỗi, không phải công cụ giải phóng dung lượng — muốn lấy lại dung lượng thật sự, bạn phải xóa chính các thư mục DerivedData.

Nguồn tham khảo

Dọn dung lượng lập trình từng bước