这个macOS原生卸载器,用完我直接把AppCleaner删了
事情要从上周说起。
我在清理电脑。
不是那种随便删几个文件就算了的清理,是我每隔半年会发作一次的那种大扫除。
打开Finder,进应用程序文件夹,看着那满屏的图标,头就开始大。
我电脑上大概装了300多个App。
有为了写一篇文章专门下的,有某个项目临时用的,有纯粹当时手痒试一下的,还有那种你已经三年没打开过但总觉得「说不定哪天用得上」于是就一直留着结果每年更新弹窗都烦你一遍的。
反正就是很多。
然后我花了两个小时,手动删了一批。
对,就是手动。
一个一个拖进废纸篓。
拖完之后,我知道这些App的配置文件、缓存、日志、沙箱容器、preferences,还散落在Library各个角落。
我甚至知道它们在哪。
`~/Library/Application Support/`、`~/Library/Caches/`、`~/Library/Preferences/`、`~/Library/Containers/`、`~/Library/Logs/`。
但我就是懒得去翻。
因为我太清楚了,你翻一天都翻不完,而且动不动就漏一个隐藏文件夹,下次电脑变慢了你都不知道是哪个残留的缓存文件在拖累系统。
所以每次清理,都是「先删App本体,然后假装剩下的垃圾不存在」。
眼不见,心不烦。
这种状态,持续了好多年。
---
我之前用过一个叫 AppCleaner 的软件。
免费,轻量,能把App和对应的文件一起删掉。
但它的原理比较简单,就是根据文件夹名和搜索词来匹配。
比如说你要删一个叫 WeChat 的App,它就去Library里找所有名字带「WeChat」「微信」「Tencent」的文件夹,列出来让你勾选。
听起来好像还行。
但问题是,很多App的残留文件,名字跟App根本不一样。
有些App的配置文件用的是bundle identifier,比如 `com.developer.appname` 这种格式。
有些用的是开发者的公司名。
有些干脆就是一个UUID。
AppCleaner 这种模糊匹配,经常漏。
而且它不处理 Homebrew 装的软件。
我Mac上很多东西是用 Homebrew 装的,`brew list` 一看一大串,AppCleaner 一个都管不到。
所以我每次还是得自己翻。
手动删完App,再手动 `brew uninstall`,再手动去Library底下翻尸。
很烦很烦。
---
然后我就看到了 Uninstally。
说真的,刚看到这个名字的时候,我第一反应是:又一个 AppCleaner 换皮。
但我点进去之后,发现不太一样。
第一,它叫 Uninstally,不是叫 Mac Cleaner Pro X 或者 MacBooster Wizard Plus 这种。
光名字就正经很多。
第二,它是 SwiftUI 写的原生应用,不是 Electron 套壳。
一个卸载器如果本身是 Electron 写的,本身就自带上百MB的垃圾,你用它来清垃圾,总感觉哪里不太对。
像那种用塑料袋装环保袋的感觉。
而 Uninstally 的体积很小,UI 也是苹果原生的那些毛玻璃效果、圆角、SF Symbols,一看就是正经 Mac App。
第三,它有个杀手级功能。
Finder 右键集成。
你在应用程序文件夹里,右键点任何一个 App,菜单里会多出一项「Uninstall with Uninstally」。
点一下,直接弹出卸载确认窗口。
我当时试了一个叫 CleanMyMac 的软件。对,就是那个当年我头脑发热花了两三百块钱买的。
说实话,CleanMyMac 本身也是卸载清理工具,但我同时用它来卸载它自己,这个画面感实在太有意思了。
结果 Uninstally 扫出来 CleanMyMac 留了 47 个文件。
47个。
散落在 Library 各个角落里。
从 Application Support 到 Caches 到 Preferences 到 Containers 到 Logs,全覆盖。
然后就一键删掉了。
干干净净。
那一刻,我有点恍惚。
我花了五分钟,把一个以前需要花两个小时才能做完的事情,做完了。
而且做得更干净。
---
然后我仔细研究了一下它是怎么做到的。
核心是 bundle identifier 匹配。
每一个 macOS 应用,在 Info.plist 里都有一个唯一的 `CFBundleIdentifier`,比如 `com.apple.Safari`、`com.microsoft.VSCode`。
Uninstally 就是拿这个 identifier,去扫描整个 Library 层级,找到所有关联的文件。
不是根据文件夹名猜的,是根据系统级的标识符精确定位的。
所以不会漏。
而且它还会分析这个 App 的 helper 子进程、XPC 服务、Launch Agents 之类的嵌套组件,然后把它们也归到这个 App 名下。
这套逻辑,比单纯的文件夹名匹配,聪明多了。
---
再往下挖,发现功能还挺全的。
一个是浏览模式。
它有个主界面,是你电脑上所有 App 的可浏览列表。
按网格或者列表排列,可以搜索,可以排序。
排序选项包括「最大的」「最近安装的」「最近打开的」「从未打开过的」「有残留的」「损坏的安装」「跨磁盘重复的」。
每一个我都觉得有用。
「从未打开过的」——这简直是灵魂拷问。你下载了但从来没点开过的 App,Uninstally 直接帮你列出来,一句话不说就让你看到自己的囤积行为。
我扫了一眼,发现有 20 多个 App 我从来没打开过。
有些我甚至不记得是什么时候下的。
有某个会议软件的旧版,有某个设计工具的试用版,有某个文本编辑器,我忘了名字,反正从来没用过。
一口气全删了。
「有残留的」也很有意思。它能扫出你电脑上所有已经删了 App 本体但还留着配置文件的孤儿文件。
这个功能是我没想到的。
因为你以为你把 App 拖进废纸篓就完事了,但实际上你不一定拖干净了。
有一次我清理一个叫 Fork 的 Git 客户端,三年前就删了,但 Uninstally 告诉我它的配置文件还在 Library 里待着,占了 400 多 MB。
我甚至不知道那 400 多 MB 是什么东西。
日志?缓存?git 历史?
不重要,删了就是。
---
另一个让我好感度飙升的功能,Homebrew 支持。
太多 macOS 卸载器对 Homebrew 零支持了。
你用一个卸载器清完 GUI 应用,然后还得开终端自己 `brew list`,找到那些 cask 和 formula,一个个 `brew uninstall`。
Uninstally 能直接读取你的 Homebrew 安装列表,列出来,标出来哪些是 cask 哪些是 formula,还给你看依赖关系。
你可以直接在 Uninstally 里卸载 brew 包,然后选择要不要用 `--zap` 模式清残留。
我不是说这件事多难,省不了多少时间。
但就是这种细节,让你觉得这个软件的开发者,是真的懂 Mac 用户的痛点。
他知道你不仅想删 App,你还想删 brew 装的,还想删残留的。
他把这些整合到一块了。
---
还有一点。
它的卸载引擎是「安全优先」的设计。
用户域的文件,也就是你自己 Home 目录底下的,删了会先进废纸篓,随时可以还原。
系统级、需要管理员权限的文件,会在卸载过程中弹一次管理员密码框,然后统一处理。
不会搞那种静默删除你系统文件的操作。
进度条也有,显示当前在删哪个文件、百分比、预计剩余时间。
就,很正经。
Sparkle 自动更新也是标配。
---
说到这,你可能觉得我在打广告。
其实真不是。
我跟 Codenta 这个团队没有任何关系,纯粹是自己用爽了想分享一下。
用完 Uninstally 之后,我做了一个决定。
把我电脑上装了五年的 AppCleaner,给删了。
用 Uninstally 删的。
它查出来 AppCleaner 自己留了 8 个残留文件。
挺讽刺的。
一个自称 Cleaner 的 App,自己也要别人来帮它擦屁股。
---
我用 Mac 快十五年了。
我一直觉得 macOS 上软件卸载这件事,是苹果自己没做好的。
iOS 上你删一个 App,长按、抖动、删除,就完了,干干净净。
但 macOS 上没有这个机制。
如果你拖进废纸篓,App 本体是没了,但那一堆支持文件、缓存、配置文件,全部留在 Library 里。
十年。
我用了十年的 Mac,Library 底下到底攒了多少已经卸载的 App 的孤儿文件。
我不敢算。
Uninstally 就是那个帮你把这个烂摊子收拾干净的工具。
它不是那种「你本来不需要」的工具。
它是那种「你一直需要但不知道存在」的工具。
下载地址放这了,目前免费:
官网:https://codenta.us/
GitHub:https://github.com/gostonx/uninstally
等一个用的爽了回来点赞的人。
---
以上,既然看到这里了,如果觉得不错,随手点个赞、在看、转发三连吧,如果想第一时间收到推送,也可以给我个星标⭐~
谢谢你看我的文章,我们,下次再见。
夜雨聆风