第 4 章 软件的安装、卸载与放行
macOS 装软件跟 Windows 差别很大:没有「下一步下一步完成」的安装向导, 大多数时候是「把图标拖进文件夹」,然后就装好了。这一章讲清楚这条路为什么这么设计, 以及遇到「打不开」「已损坏」「无法验证开发者」时,正确的处理顺序是什么。
一、四条安装路径
| 形式 | 怎么装 | 装到哪 | 卸载方式 |
|---|---|---|---|
| App Store | 点「获取」/「安装」 | 系统托管 | 启动台里长按删除 |
| dmg 磁盘映像 | 打开 → 拖进 Applications | /Applications |
拖到废纸篓 |
| pkg 安装包 | 双击 → 一路继续 | 按包内脚本决定,可能散落多处 | 要专门工具或脚本 |
| Homebrew cask | brew install --cask 名字 |
/Applications |
brew uninstall --cask 名字 |
为什么是「拖进去就装好了」
macOS 里的 .app 不是单个可执行文件,而是一个文件夹(包),
里面装着可执行文件、资源、图标、签名信息。
所谓「安装」,在绝大多数情况下就是把整个包复制到 /Applications。
想看内部结构:在 .app 上右键 → 显示包内容。
里面通常是 Contents/MacOS/(可执行文件)、Contents/Resources/(资源)、
Contents/Info.plist(元信息)、Contents/_CodeSignature/(签名)。
这也解释了一个常见困惑:为什么「复制应用程序文件夹里的 App 到另一台 Mac」通常能直接用。 因为它本来就是自包含的。少数程序不行,是因为它还依赖
~/Library里的配置或额外的系统组件。
dmg 的正确用法
- 双击 dmg,会挂载成一个虚拟磁盘,弹出窗口。
- 把里面的图标拖到 Applications 文件夹的快捷方式上。
- 在访达边栏点那个虚拟磁盘旁边的 ⏏ 推出(
⌘E)。
直接从 dmg 里双击运行也能跑,但那样程序是从虚拟磁盘启动的, 推出之后下次就找不到了,而且每次都要重新挂载。必须先拖进去。
二、「打不开」的四种情况,分清再动手
macOS 的 Gatekeeper 会检查每个要运行的程序的签名和公证状态。 不同提示对应不同原因,处理方式完全不一样。
情况 1:「无法打开,因为无法验证开发者」
程序有签名,但没经过 Apple 公证,或者签名不是来自已知开发者。
正确做法:不要点「好」,也不要去改全局设置。到访达里右键(或 Control + 点按)→ 打开, 弹窗里会多出一个「打开」按钮。点它,之后这个程序就不再被拦了。
这个动作本质上是「我确认过,我知道我在做什么」。系统给你一次机会,而不是关掉整道门。
情况 2:「已损坏,打不开。你应该将它移到废纸篓」
这个提示九成不是文件真的损坏了。 它最常见的原因是:文件从网页/网盘下载后带了一个「隔离」标记(quarantine attribute), 而程序本身没有有效的签名,系统就统一报成「已损坏」。
# 查看文件是否带隔离标记
xattr -l /Applications/某程序.app
# 应该有 com.apple.quarantine 这一条
# 只删这一个标记(推荐,最精准)
xattr -d com.apple.quarantine /Applications/某程序.app
# 递归删掉整个包内的隔离标记
xattr -cr /Applications/某程序.app
xattr -cr 里的 -c 是清除全部扩展属性,-r 是递归。
执行完再打开,通常就正常了。
如果删了标记还是报损坏,那可能真的是下载不完整或者被改过。 重新下载一次,并对一下官方给的哈希:
shasum -a 256 ~/Downloads/某程序.dmg
情况 3:「App 已损坏,无法打开」且来自 arm64 与 x86 混装
Apple 芯片机器上跑 Intel 程序需要 Rosetta 2。装过 Rosetta 还报错时, 先确认一下当前架构和 Rosetta 状态:
# 当前终端是什么架构
arch
# 装 Rosetta 2(Apple 芯片)
softwareupdate --install-rosetta --agree-to-license
# 用 Rosetta 打开某个程序
arch -x86_64 /Applications/某程序.app/Contents/MacOS/某程序
情况 4:「App 无法打开,因为它来自身份不明的开发者」且右键也没有「打开」
说明隔离属性还在,先按情况 2 处理。仍不行的话,检查是否是 pkg 装到了错误位置, 或者程序依赖的辅助组件(比如内核扩展、系统扩展)没被允许。
macOS 13 之后,第三方内核扩展需要在「系统设置 → 隐私与安全性」底部点「允许」, 然后重启才生效。这一步经常被忽略,表现为「装完了但功能不工作」。
三、不要为了装一个软件关掉 Gatekeeper
网上流传的做法是全局关掉:
sudo spctl --master-disable
spctl --status
这在早期版本里会在「隐私与安全性」里打开一个「任何来源」的选项。 但从 macOS 15 Sequoia 起,界面上的这个选项已经被移除,命令仍然存在,行为视版本而变。
不建议这么做,理由很实际:Gatekeeper 是这台机器上唯一在「第一次运行」时 替你检查一遍的东西。关掉之后,任何下载来的程序双击就跑,没有任何提示。 而右键打开只需要多按一个键,效果是一样的。
四、卸载:为什么拖到废纸篓不够
拖到废纸篓只删了 /Applications 里的那个包。
程序运行时写进用户库的配置、缓存、日志全都还在。日积月累,
~/Library 会变成一堆没人认领的目录。
手动清干净的顺序
- 退出程序(
⌘Q,不是关窗口)。 - 把 .app 拖到废纸篓。
- 下面这几个目录里,搜程序名(或开发商标识),删掉对应项。
# 按程序名找残留(把 关键词 换成 App 名或厂商名)
ls -d ~/Library/Application\ Support/*关键词*
ls -d ~/Library/Caches/*关键词*
ls -d ~/Library/Preferences/*关键词*
ls -d ~/Library/Logs/*关键词*
ls -d ~/Library/Containers/*关键词*
ls -d ~/Library/Saved\ Application\ State/*关键词*
ls -d ~/Library/LaunchAgents/*关键词*
# 系统级残留(需要 sudo)
sudo ls -d /Library/Application\ Support/*关键词*
sudo ls -d /Library/LaunchDaemons/*关键词*
sudo ls -d /Library/PrivilegedHelperTools/*关键词*
先只「列出来看」再删。这些目录里有很多是系统组件, 名字里带关键词不代表是那个程序的。
用 Homebrew 装的就好办
brew uninstall --cask 程序名
brew uninstall --zap --cask 程序名 # 连同配置一起清
brew cleanup --prune=all
--zap 会按 cask 定义里记录的路径删除残留,比手动找可靠。
五、pkg 装的怎么卸
pkg 安装包会执行安装脚本,可能把文件放到任意位置,还可能装了开机启动的守护进程。 它的安装记录在:
# 列出所有通过 pkg 装的包
pkgutil --pkgs
# 查某个包安装了哪些文件
pkgutil --files com.example.pkgname
# 查某个文件属于哪个包
pkgutil --pkgs --file-info /usr/local/bin/某命令
卸的时候先停掉可能存在的服务:
# 查是否注册了后台服务
launchctl list | grep 关键词
# 卸载一个 launchd 服务
launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/某个.plist
sudo launchctl bootout system /Library/LaunchDaemons/某个.plist
然后按 pkgutil --files 列出的路径逐个删。
注意不要删到 /System 下面的东西,那部分受 SIP 保护,也删不掉。
六、开机自启的两个位置
macOS 13 之后,最容易搞混的就是「为什么程序老是自己启动」。 自启有四个来源:
- 登录项(系统设置 → 通用 → 登录项与扩展)——最直观,用户手动加的。
- 后台项目(同一页下面)——程序注册的常驻组件,需要你允许才生效。
- LaunchAgents——
~/Library/LaunchAgents(用户级)和/Library/LaunchAgents(所有用户)。 - LaunchDaemons——
/Library/LaunchDaemons,系统级,开机就跑,不需要用户登录。
# 看所有用户级自启项
ls ~/Library/LaunchAgents/
ls /Library/LaunchAgents/
# 看系统级守护进程
ls /Library/LaunchDaemons/
# 禁止某个 agent(现代写法)
launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.xxx.plist
# 重新允许
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.xxx.plist
七、一个判断标准
装任何软件之前问自己一句:它需要什么权限? 一个看图软件要求「辅助功能」和「录屏」,那就不正常。 一个输入法要求「完全磁盘访问」,也值得想一想。
macOS 把这些权限做成弹窗,不是刁难你,而是让它成为唯一一次你能看见的机会。 点了允许之后,就不再提示了。
下一章:性能、存储与电池 →