Bir Mac uygulamasını kaldırmanın üç yolu ve her birinin geride bıraktığı

Çöp Kutusu'na sürükle. Sistemde hazır, ücretsiz ve uygulama paketini gerçekten kaldırıyor. Kaldırmadığı şey, uygulamanın kendi dışına yazdığı her şey: tercihler, önbellekler, container klasörleri, kaydedilmiş pencere durumu, launch agent'lar, kurulum makbuzları ve Sistem Ayarları'nda Gizlilik ve Güvenlik altında duran kayıtlar. Sonuncular için macOS sana hiçbir düğme vermiyor. Onları temizleyen araç olan tccutil, uygulamayı LaunchServices üzerinden çözüyor; yani paket Çöp Kutusu'na gittiği anda "No such bundle identifier" diyor ve verilmiş izinler izin veritabanında sonsuza kadar kalıyor. Geçen yıl sildiğin uygulamaların hâlâ Erişilebilirlik listesinde durmasının sebebi bu.

Uygulamanın kendi kaldırıcısı. Böyle bir şey geliyorsa - Adobe, Microsoft, çoğu VPN istemcisi - doğru cevap odur, çünkü neyi nereye koyduğunu üretici bilir. Çoğu uygulamada yok.

Ayrı bir kaldırma uygulaması. AppCleaner bu işi yıllardır ücretsiz yapıyor ve istediğin şey paket artı ~/Library içindeki bariz klasörlerse yeterli; Pearcleaner aynı işin açık kaynaklı yorumu. Unroot daha dar bir sorunun etrafında kurulu: ne bulabiliriz değil, neyi kanıtlayabiliriz ve neyi geri koyabiliriz. Aşağıdaki her şey yayınlanan sürümde var.

Nerelere bakıyor ve her satır neden eşleştiğini neden yazıyor

Bir tarama 58 konumu okuyor. Tahmin edeceklerin var (Application Support, Preferences, Caches, Containers, Group Containers, Saved Application State) ve etmeyeceklerin: HTTPStorages, WebKit, Cookies, /var/folders altındaki kullanıcıya özel ağaçlar, ses eklentisi kökleri, QuickLook üreticileri. Ev klasörünün dışında /Library/LaunchDaemons, /Library/PrivilegedHelperTools, /var/db/receipts ve /Users/Shared okunuyor. Birkaçı özel okunuyor: Application Support bir seviye daha derin, çünkü üreticiler iç içe yerleşiyor ve önerilmesi gereken şey iç klasör - her kardeş ürünü de beraberinde götürecek üretici klasörü değil; launch agent plist'leri ise dosya adına değil Label ve ProgramArguments alanlarına bakılarak eşleşiyor, çünkü üreticiler dosyayı uygulamanın değil daemon'ın adıyla adlandırıyor.

Sonra eşleştirme geliyor; bir kaldırma uygulaması ya burada güven kazanır ya da burada veri yok eder. Birebir paket kimliği kesindir. Aynı kimliğin noktalarla ayrılmış bütün bir parça olarak geçmesi de öyle - com.vendor.app.helper böyle yakalanıyor; uygulamanın kendi imzasında beyan ettiği app group da öyle; ve pkgutil'in bu paketi kurduğunu kanıtlayabildiği bir kurulum makbuzundaki yol da. İsim eşleşmesi ise yalnızca ihtimaldir ve öyle derecelendiriliyor.

Asıl mesele o listede olmayan. İki parçalı üretici önekine ve imza ekibine dayanan kurallar vardı ve ikisi de silindi: ikisi birlikte iki gerçek taramada 45 kez eşleşti, her biri başka bir uygulamanın verisiydi ve bir kez bile gerçek bir kalıntı çıkmadı. Aynı geliştirici, aynı uygulama demek değil. En güçlü kural en sonda çalışıyor: bir dosya, kurulu başka bir uygulamanın kimliği altında duruyorsa o uygulamaya aittir, nokta. Ve her satır neden eşleştiğini gösteriyor; güvendiğin bir listeyle inanmak zorunda kaldığın bir liste arasındaki fark bu.

Üç seviye ve baştan işaretli gelenler

Bir uygulama için bulunan tüm izleri listeleyen Unroot inceleme ekranı: Kaldırılması güvenli başlığı altında her satırın yolu ve eşleşme nedeni
Her satır neden eşleştiğini taşıyor, başlık ise üç seviyenin her birindeki sayıyı.

Bulgular kaldırılması güvenli, bakmaya değer ve hassas diye derecelendiriliyor ve bu derecelendirme tek bir soruya cevap veriyor: bu satır konusunda ne kadar dikkatli olmam gerekiyor. Güvenli, geri alınabilir, ev klasörünün içinde ve kesinlikle uygulamanın. Bakmaya değer, yalnızca isimle eşleşen ya da hâlâ kurulu bir uygulamayla paylaşılan şey. Hassas ise Anahtar Zinciri kayıtları, ayrıcalıklı yardımcılar, sistem eklentileri ve ev klasörünün dışındaki her şey - herkesin korktuğu hatayı üretebilecek tek seviye.

Sezgiye aykırı olan kısım baştan neyin işaretli geldiği, çünkü güvenli seviye değil. Bir satır, eşleşme kesin olduğunda işaretleniyor; geri alınabilir olduğunda değil. İkisini birbirine karıştırmak ürünü dürüst olmaktan çıkarmıştı: bir uygulamanın lisansı Anahtar Zinciri'nde durur, dolayısıyla o satırları işaretsiz bırakmak, varsayılan kaldırmanın uygulamayı sessizce etkin bırakması demekti. Hassas bir Anahtar Zinciri satırı işaretli gelir; yalnızca isimle eşleşen bir satır gelmez.

Aynı ekran diğer modu da taşıyor. Sıfırla, uygulamayı yerinde bırakıp sakladığı her şeyi kaldırıyor - kurulum makbuzları hariç, çünkü hâlâ kurulu bir paketi pkgutil'in unutması o paketin kendi güncelleyicisini bozuyor. Anahtar Zinciri kayıtları bilerek kapsamda kalıyor: fabrika ayarlarına dönmüş bir uygulama oturumu kapalı bir uygulamadır.

Hiçbir şey silinmiyor

11 üzerinden 11 kaldırıldı yazan Unroot kaldırma raporu, Çöp Kutusu'ndaki karantina klasörünün yolu ve bir Geri Al düğmesi
Çöp Kutusu'nda tarihli tek bir klasör, yanında manifest ve hâlâ masada duran bir Geri Al.

Kaldırılan şeyler Çöp Kutusu'nun içindeki tarihli tek bir klasöre gidiyor - Unroot - Spectacle - 2026-08-21 11-01-33 - ve her biri kendi numaralı yuvasına, ki ~/Library/Preferences içindeki com.vendor.app.plist, /Library/Preferences içindekinin üzerine sessizce yazmasın.

Dört yüz ayrı öğe yerine tek klasör olması kısmen okunabilirlik, kısmen de yetenek meselesi: Finder'ın Geri Koy komutu bir gruptaki yalnızca ilk öğeyi geri koyuyor ve programatik geri koymanın herkese açık bir API'si yok; yani bunun üstüne kurulmuş bir geri alma, sistemin tutamayacağı bir söz olurdu. Dosyaların yanında unroot-manifest.json duruyor: her öğenin nereden geldiğini yazan düz bir liste. Geri Al'ın okuduğu şey o ve Unroot ortada olmasa bile okunabilir kalıyor.

Bir kaldırmanın gerçekten kalıcı olan tek parçası var ve alt bar onu kırmızıyla sayıyor. Anahtar Zinciri kaydı bir dosya değil, dolayısıyla bir klasöre taşınamıyor; silmek uygulamanın oturumunu kapatıyor ve sakladığı lisansı da götürüyor. Onay sayfası bunları saymak yerine tek tek adlandırıyor, çünkü bir sayı onay değildir.

Çökmeden sağ çıkan bir geri alma

Manifest yalnızca başarılı olduğu gözlemlenen işlemleri kaydedebiliyor, yani ancak çalışma bittikten sonra yazılabiliyor - ve arada bir çökme, taşınmış dosyaları nereden geldikleri kayıtsız bırakırdı ki manifestin var olma sebebi tam olarak bu sözü tutmak. Bu yüzden hiçbir şey taşınmadan önce, planlanan her kaydın bir günlüğü aynı klasöre yazılıyor ve tamamlanan bir çalışma onu siliyor. Manifesti olmayan bir günlük böylece yarıda kalmış bir kaldırmanın imzası oluyor ve bir sonraki açılış manifesti ondan yeniden kuruyor: yalnızca dosyası gözle görülür biçimde yuvasında duran kayıtları tutarak.

Geri Al ise tersten bir tekrar oynatma. Özgün yolda artık başka bir şey varsa - uygulamayı yeniden kurmuşsundur - geri koyma, üzerine yazmak yerine numaralı bir kardeşe sapıyor, çünkü geri alma başarılı olmak için hiçbir şeyi yok etmemeli. Launch görevleri yalnızca yerine konmuyor, yeniden başlatılıyor da: plist'i geri koyup daemon'ı kapalı bırakmak dosyaları geri getirir ama davranışı sessizce getirmez. İki yön de her şeyin yukarıda yanlış yapıldığını varsayan bir politikadan geçiyor: /System, Anahtar Zinciri klasörleri, iCloud Drive ve Belgeler, Masaüstü, İndirilenler, Resimler, Filmler ile Müzik klasörlerin ne eşleşirse eşleşsin asla bir uç nokta olamıyor.

Geri Al'ın geri getirmediği tek adım izin sıfırlaması ve uygulama bunu dipnotta değil satırın üstünde söylüyor: gizlilik izinleri sıfırlanır, geri yüklenmez. Her uygulama bir dahaki ihtiyacında yeniden soruyor.

Bunların hiçbirinin son kullanma tarihi yok. Unroot'un yaptığı her kaldırma, tek bir ekranda, klasörünün tuttuğu yerle birlikte duruyor; iki ay önceki bir kaldırma tam olarak iki dakika öncekiyle aynı şekilde geri alınıyor. Hâlâ geri alınıp alınamayacağına da o sırada yazılmış bir işaret değil, diskin kendisi karar veriyor.

Her şeyi tutmanın bedeli, karantina klasörleriyle dolu bir Çöp Kutusu. Normal cevap onu boşaltmak; seçici olmak istersen Unroot tek bir klasörü istek üzerine siliyor. Uygulamada bir şeyi gerçekten silen tek yer burası, o yüzden çitle çevrili: yolun gerçekten kendi klasörlerinden biri olduğuna dair üç denetim ve sen açmadıkça kapalı duran otomatik bir süpürme.

Kimsenin elle temizleyemediği izin kayıtları

Sen hiçbir şeyi kaldırmadan önce Unroot izin veritabanını okuyor - salt okunur ve zaten ~/Library'yi görmek için ihtiyaç duyduğu Tam Disk Erişimi ile - ve uygulamanın nelere sahip olduğunu gösteriyor. Erişilebilirlik, Tam Disk Erişimi, Ekran Kaydı, Girdi İzleme, Otomasyon ve yirmi beş kadar başka izin adlarıyla çözülüyor, toplamda otuza yakın izin türü. Bunu neredeyse başka hiçbir şey göstermiyor ve bir kaldırmada sıranın neden önemli olduğunun en ikna edici kanıtı bu.

Çünkü önemli. Sıfırlamanın paket hâlâ diskteyken çalışması gerekiyor, bu yüzden paket en son taşınıyor: launch görevleri kapatıldıktan ve Anahtar Zinciri kayıtları silindikten sonra. Önce paketi kaldırmak tek yönlü hata ve kaldırılmış onca uygulamanın hâlâ Sistem Ayarları'nda dolaşmasının sebebi de bu.

Sonrasında rapor, araçların işini yaptığını varsaymak yerine veritabanını yeniden okuyor. macOS'in bazı Tam Disk Erişimi sıfırlamalarını reddettiği biliniyor; rapor ya izinlerin temizlendiğini doğrulanmış olarak söylüyor ya da hayatta kalanı adlandırıp elle temizlemeni istiyor.

Çalışan uygulamalar her şeyden önce ele alınıyor. Her birinden çıkması isteniyor ve reddederse sessiz bir zorla çıkıştansa sana bir karar düşüyor: zorla kapat ya da o uygulamayı atla ve bütün dosyalarına dokunma.

Yıllar önce sildiğin uygulamalar ve arkalarında çalışmaya devam edenler

Unroot'un artık kalıntı taraması: paket kimliğine göre gruplanmış öksüz önbellekler ve günlükler, yalnızca güvenli satırlar işaretli
Tarama yalnızca kimlik biçimindeki kalıntıları listeliyor ve macOS'in yeniden üreteceği önbellek ile günlüklerden başkasını işaretlemiyor.

Dar bir eşleştiricinin diğer yarısı, çoktan gitmiş uygulamalara ait kalıntıların ortaya çıkacak bir yerinin kalmaması. Bu yüzden onların kendi taraması var ve o tarama bilerek temkinli. Yalnızca kimlik biçimindeki şeyleri listeliyor - en az üç noktayla ayrılmış parçası olan ve boşluk içermeyen adlar - çünkü bir şirketin adını taşıyan klasör her şeye ait olabilir ve tahmin etmek, bir kaldırma uygulamasının dokunmaması gereken şeyi silme biçimidir.

Yalnızca önbellekler ve günlükler işaretli geliyor. Uygulama verileri ve ayarları gelmiyor ve ekran nedenini söylüyor: listedekilerin bir kısmı hâlâ kullandığın bir uygulamanın içindeki bir çatının yazdığı önbellek ve dışarıdan bakınca birebir aynı görünüyor. Bu liste bir başlangıç noktası, bir hüküm değil.

Artık bir dosya hareketsizdir; artık bir launch agent değildir. Yıllar önce kaldırdığın bir uygulamanın Sistem Ayarları'nda hâlâ bir arka plan ögesi bırakabilmesinin - ve Sistem Ayarları'nın onu kaldırmak için sana bir yol vermemesinin - sebebi budur. Bu yüzden aynı fikir launchd'ye çevriliyor: tek bir ekran, sorulmadan başlayan her şeyi listeliyor - launch agent'lar, daemon'lar ve uygulamaların kendi paketlerinin içinden SMAppService ile kaydettiği giriş görevleri - ve her birinin sahibini söylüyor.

Yalnızca programı kayıp olanlar toplu seçilebiliyor ve bu kısıtlama bir eksiklik değil, tasarımın kendisi. com.docker.vmnetd gibi bir görev hâlâ kurulu bir uygulamayla aynı üretici önekini paylaşıyor; onu öksüz değil ilişkili diye derecelendirmek, tam olarak yaşayan bir şeyi "kaldırılması güvenli" başlıklı bir listeden uzak tutmak için var. Çalıştıracak bir programı olan bir görev, adı ne kadar terk edilmiş görünürse görünsün asla öksüz değildir.

Bilerek yapmadıkları

Tam Disk Erişimi gerekiyor ve elle açılması gerekiyor, çünkü macOS bir uygulamaya bunu isteme yolu bırakmıyor; o olmadan da tarama çalışıyor ama yalnızca ev klasörünün dışındaki konumları kapsıyor ve kısa bir listeyi temiz bir liste diye yutturmak yerine bunu söylüyor. Ev klasörünün dışındaki bir şeyi kaldırmak yönetici parolanı bir kez soruyor.

Bazı işleri baştan reddediyor: Apple'ın kendi yazılımını, kendisini ve sistem eklentilerini - sonuncular için "Unroot bunları kaldıramaz" başlıklı bir bölümde işi kendin nerede yapacağın yazıyor.

Menü çubuğunda oturmuyor ve bir uygulamayı Çöp Kutusu'na sürüklemeni bekleyen bir şey de yok - Unroot sen açtığında tarıyor, geri kalan zamanda hiçbir şey yapmıyor. Yerleşik tek parça bir Finder uzantısı ve sen Sistem Ayarları -> Uzantılar -> Finder'dan açana kadar kapalı duruyor. Açtıktan sonra bir uygulamaya sağ tıklamak uygulamayı kaldırmayı öneriyor. Bunun nereye düştüğünü bilmekte fayda var, çünkü macOS bu konuda tutarlı değil: ~/Applications içinde uygulamanın adını taşıyan üst seviye bir öge, diğer her yerde - uygulamaların çoğunun yaşadığı /Applications dahil - Servisler alt menüsünde, daha yalın "Uninstall with Unroot" adıyla. Kendi başına hiçbir şey kaldırmıyor; seçimini uygulamaya devrediyor ve aynı inceleme ekranı açılıyor.

Bir disk temizleyicisi de değil. Adını verdiğin tek bir uygulamanın izlerini arıyor, "boşaltabileceğin şeyleri" değil; ve başka bir kullanıcının hesabına asla yaklaşmıyor.

Mac App Store sürümü yok, çünkü ~/Library'yi okumak, izin kayıtlarını sıfırlamak ve root'a ait dosyaları taşımak bir kum havuzunun içinden mümkün değil.

Ne kadar ve başka neye bakmalı

Unroot macOS 14 veya sonrasını istiyor, Apple Silicon ve Intel'de çalışıyor ve yaklaşık 10 MB yer kaplıyor. İstediğini öde modelinde, önerilen fiyat 4,99 dolar - sıfırı gerçekten kapsayan bir tutar - ve lisans her hâlükârda kalıcı. Tam dökümü Unroot sayfasında.

Peşinde olduğun şey belirli bir uygulama değil de disk alanıysa komşu Sweep - İndirilenler klasörünü senin yazdığın kurallara göre düzenliyor ve bir aydan eski kurulum dosyalarını çöpe atıyor; özellik özellik anlatımı Mac'te dosyaları otomatik sıralamak yazısında. Geri kalanının toplu bakışı ise Mac yardımcı uygulamaları yazısında.