← 专题目录

第 4 章 软件的安装、卸载与放行

2026-10-04 约 11 分钟

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 的正确用法

  1. 双击 dmg,会挂载成一个虚拟磁盘,弹出窗口。
  2. 把里面的图标拖到 Applications 文件夹的快捷方式上。
  3. 在访达边栏点那个虚拟磁盘旁边的 ⏏ 推出(⌘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 会变成一堆没人认领的目录。

手动清干净的顺序

  1. 退出程序(⌘Q,不是关窗口)。
  2. 把 .app 拖到废纸篓。
  3. 下面这几个目录里,搜程序名(或开发商标识),删掉对应项。
# 按程序名找残留(把 关键词 换成 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 把这些权限做成弹窗,不是刁难你,而是让它成为唯一一次你能看见的机会。 点了允许之后,就不再提示了。


下一章:性能、存储与电池 →