iOS simülatörlerinin kapladığı alanı boşaltma

Simülatörler iki yerde alan kaplar: her cihazın kendi verisi ve açılırken kullandığı iOS runtime imajları. Hangi komutun neyi götürdüğünü bildiğin sürece ikisini de xcrun simctl ile elle temizleyebilirsin.

Güncelleme:

Simülatör alanı nereye gidiyor

Xcode'da gördüğün her simülatör, ~/Library/Developer/CoreSimulator/Devices altında UDID'siyle adlandırılmış bir klasördür. Yüklediğin uygulamalar, onların verileri, fotoğraflar, anahtar zinciri ve önbellekler burada durur; her gün test ettiğin simülatör zamanla şişer. Üzerinde çalıştığı işletim sistemi ise ayrı: her iOS, watchOS, tvOS ya da visionOS sürümü bir runtime'dır ve /Library/Developer/CoreSimulator altında disk imajı olarak tutulur.

Bir geliştiricinin Mac'inde cihaz klasörleri 19 GB, iki iOS runtime'ı da 15,3 GB tutuyordu. Karar vermeden önce kendi makineni ölç:

# cihaz verisi, toplam ve simülatör başına
du -sh ~/Library/Developer/CoreSimulator/Devices
du -sh ~/Library/Developer/CoreSimulator/Devices/*/ | sort -h | tail

# kurulu runtime'lar ve toplam boyutları
xcrun simctl runtime list

Paralel test çalıştırmaları da simülatörleri ~/Library/Developer/XCTestDevices altına kopyalar. Bu kopyalar her test için yeniden oluşturulur; test çalışmıyorken klasör temizlenebilir.

Simülatörleri listele

simctl list her simülatörü UDID'si ve durumuyla gösterir. UDID'leri yukarıdaki klasör boyutlarıyla eşleştirince hangi cihazın ağır olduğunu görürsün.

# tüm cihazlar, runtime'a göre gruplu
xcrun simctl list devices

# yalnızca şu an açık olanlar
xcrun simctl list devices booted

# bu Xcode'un tanıdığı runtime'lar
xcrun simctl list runtimes

Erase mi delete mi: hangisi neyi götürür

Bir simülatörün alanını geri almanın iki yolu var ve ikisi aynı şey değil.

  • Erase (xcrun simctl erase <UDID>) cihazı fabrika ayarlarına döndürür. Yüklü uygulamalar, verileri, fotoğraflar ve ayarlar gider ama simülatör aynı ad ve UDID ile Xcode'un cihaz listesinde kalır. Ona işaret eden scheme'ler ve script'ler çalışmaya devam eder. Hâlâ test ettiğin cihazlar için bunu kullan.
  • Delete (xcrun simctl delete <UDID>) simülatörü tamamen kaldırır. Xcode'dan kaybolur, UDID'sine bağlı her şey onu bulamaz olur. Bir kere oluşturup unuttuğun fazladan kopyalar gibi artık gerekmeyen cihazlar için kullan.
# tek bir simülatörü sıfırla, listede kalsın
xcrun simctl shutdown <UDID>
xcrun simctl erase <UDID>

# tek bir simülatörü tamamen kaldır
xcrun simctl delete <UDID>

İki komut da all kabul eder. xcrun simctl erase all bütün simülatörleri sıfırlar, xcrun simctl delete all hepsini kaldırır. Sildikten sonra Xcode özel cihazlarını kendiliğinden geri getirmez; Window > Devices and Simulators üzerinden yeniden eklersin. Simülatörün içindeki hiçbir şeyin yedeği yoktur: test verisi, içine kaydettiğin ekran görüntüleri ve oturum açılmış test hesapları iki durumda da gider.

Artık çalışmayan simülatörleri sil

Eski bir runtime'ı kaldırdığında ya da Xcode'u güncellediğinde, o runtime'da çalışan simülatörler geride kalır ama artık açılamaz. simctl bunlara unavailable der. Tek bir komut yalnızca bunları siler, çalışan simülatörlere dokunmaz:

xcrun simctl delete unavailable

Bu rehberdeki en güvenli temizlik komutu budur: yalnızca mevcut Xcode'un desteklemediği, zaten açamayacağın cihazları siler.

Eski simülatör runtime'larını kaldır

Tek tek bakınca en büyük kalemler genellikle runtime'lardır. Xcode her büyük sürümde yenisini indirir, eskileri de tutar. Sana yalnızca gerçekten test ettiğin sürümlerin runtime'ı lazım.

En kolayı Xcode'dan: Xcode > Settings > Components ekranını aç, eski runtime'ı seç ve kaldır. Terminal'de simctl runtime delete aynı işi yapar ve deneme modu vardır; bir şey silinmeden önce neyin gideceğini görürsün. Bir runtime o sürümdeki bütün simülatörlerin ortak tabanıdır, yani birini kaldırmak altında listelenen her cihazı etkiler:

# kurulu runtime'lar ve tanımlayıcıları
xcrun simctl runtime list

# önizleme: aynı sürümün daha yeni derlemesi olan runtime'lar
xcrun simctl runtime delete --outdated --dry-run

# önizleme: son 90 gündür kullanılmayan runtime'lar
xcrun simctl runtime delete --notUsedSinceDays 90 --dry-run

# listedeki tanımlayıcıyla tek bir runtime'ı kaldır
xcrun simctl runtime delete <identifier>

Önizleme doğru görünüyorsa aynı komutu --dry-run olmadan çalıştır. Silinen runtime'ı kullanan simülatörler unavailable olur; ardından xcrun simctl delete unavailable ile onları da temizle.

CoreSimulator önbellekleri

/Library/Developer/CoreSimulator/Caches her runtime derlemesi için simülatörlerin daha hızlı açılmasını sağlayan bir dyld paylaşımlı önbelleği tutar. Sistem geneli klasörde olduğu için silmek yönetici yetkisi ister; önbellek bir sonraki açılışta yeniden oluşturulur ve o açılış yavaş olur. Bu alanı geri almanın temiz yolu runtime'ı silmektir. ~/Library/Developer/CoreSimulator/Caches ise kullanıcı seviyesindeki önbellek klasörün; çoğu zaman küçüktür, uğraşmadan önce du -sh ile bak.

Simülatörler Xcode'un bıraktıklarının yalnızca bir parçası. Derleme çıktıları için DerivedData temizleme, cihaz sembolleri için DeviceSupport rehberi, genel tablo için de Sistem Verileri neden bu kadar büyük rehberine bak.

CleanDev ile

CleanDev tam sürümü (doğrudan indirme, yakında çıkıyor) simülatör içeriğini simctl erase ile sıfırlar; cihazlar adını ve UDID'sini korur, Xcode'da kalır. Açık bir simülatöre hiç dokunulmaz, her kalemde ne kadar yer kapladığı ve sıfırlanınca neyin gideceği yazar. Simülatör silmek ve runtime kaldırmak henüz kapsamında değil; onlar için Xcode > Settings > Components ekranını ya da yukarıdaki komutları kullan.

Sorular

CoreSimulator klasörünü silmek güvenli mi?

~/Library/Developer/CoreSimulator/Devices klasörünü elle silmek bütün simülatörleri götürür ve Xcode'un cihaz listesini tutarsız bırakabilir. Bunun yerine xcrun simctl erase ya da xcrun simctl delete kullan; aynı işi CoreSimulator'ı bozmadan yaparlar.

xcrun simctl delete unavailable ne yapar?

Runtime'ı artık mevcut Xcode tarafından desteklenmeyen simülatörleri siler; genelde Xcode güncellemesinden ya da runtime kaldırdıktan sonra ortaya çıkarlar. Çalışan simülatörlere dokunmaz.

Simülatörü sıfırlamak uygulamamın kodunu siler mi?

Hayır. Erase yalnızca simüle edilen cihazı sıfırlar, yani içindeki yüklü uygulamaları ve verilerini. Projen ve kaynak kodun başka yerde durur; uygulama Xcode'dan bir sonraki çalıştırmada yeniden yüklenir.

Eski bir iOS simülatör runtime'ını nasıl silerim?

Xcode'da Settings > Components ekranından kaldırabilirsin. Terminal'de xcrun simctl runtime list ile tanımlayıcısını bul, --dry-run ile kontrol ettikten sonra xcrun simctl runtime delete <identifier> çalıştır.

Bir simülatör neden birkaç gigabayt tutuyor?

Her simülatör yüklü uygulamaların, verilerinin, önbelleklerin ve medyanın kendi kopyasını tutar. Her gün test ettiğin cihazlar düzenli olarak büyür; sıfırlamak o alanı geri verir.

Diğer rehberler