1. 为什么还要折腾 Homebrew 之外的 ADB 安装方式
1.1 从一次真实的翻车现场说起
先说个我上周遇到的真实情况。同事新入职,领了一台 M2 芯片的 MacBook Pro,第一件事就是装 ADB 准备调试安卓设备。他照着网上搜到的教程敲了brew install android-platform-tools,结果卡在Updating Homebrew...整整二十分钟没动静,最后报了个Failed to connect to raw.githubusercontent.com port 443的错误。他换了手机热点、重启了终端、甚至重装了 Homebrew,折腾一下午还是没搞定。
这个场景我相信很多人都遇到过。Homebrew 确实是 Mac 上最主流的包管理器,装 ADB 一条命令就能搞定,但它有个前提——你得先有一个能正常工作的 Homebrew,而且网络环境得配合。现实情况是,Homebrew 的安装和更新本身就经常出问题,尤其是国内网络环境下,brew update卡住、brew install超时几乎是家常便饭。更别说有些公司的电脑有安全策略限制,根本不允许你随便装包管理器。
所以这篇文章想聊的核心问题是:当 Homebrew 用不了、不好用、或者你压根不想用它的时候,Mac 上还有哪些靠谱的方式能把 ADB 装起来并配好环境变量?我会把几种主流方案都拆开讲清楚,包括手动下载官方工具包、通过 Android Studio 附带安装、用 SDK Manager 单独拉取,以及最容易被忽略的环境变量配置细节。每一种方法我都会说明适用场景、具体步骤、以及我自己踩过的坑。
这篇文章适合谁看?如果你是刚接触安卓调试的新手,或者你已经被 Homebrew 的各种网络问题折磨过,又或者你需要在一台受限的办公电脑上快速把 ADB 跑起来,那下面的内容应该能帮你省下不少时间。我不打算只给你一条命令就完事,而是把背后的逻辑和避坑点都讲透,让你下次遇到类似问题能自己判断该怎么选。
1.2 ADB 到底是什么,为什么 Mac 上装它这么麻烦
在展开具体方法之前,有必要先把 ADB 这个东西说清楚,不然后面讲路径配置的时候容易懵。
ADB 全称 Android Debug Bridge,翻译过来叫“安卓调试桥”。你可以把它理解成一座连接电脑和安卓设备之间的桥。这座桥是双向的:你可以在电脑上敲命令让手机执行操作(比如安装应用、抓取日志、截屏、模拟点击),手机也可以把它的运行状态回传给电脑。做安卓开发、测试、逆向分析、甚至只是想把手机里某个应用的数据导出来,都离不开它。
ADB 本身不是一个单独的可执行文件,它是一组工具的集合。你下载完官方工具包解压后,会看到目录里有adb、fastboot、aapt、etc1tool等好几个文件。其中adb是我们最常用的,fastboot用于刷机和进入引导模式,aapt用来解析 APK 包信息。这些工具都是命令行程序,没有图形界面,所以你必须通过终端来调用它们。
那为什么在 Mac 上装 ADB 会麻烦呢?核心原因有三个。
第一,Mac 系统本身不自带 ADB。Windows 用户有时候装个手机助手就顺带把 ADB 装上了,但 macOS 没有这种“顺带”的渠道,你得自己动手。
第二,ADB 是命令行工具,必须配置环境变量才能在任意目录下调用。如果你只是把adb文件放在某个文件夹里,那每次用的时候都得先cd到那个目录,或者输入完整路径,非常反人类。环境变量PATH的作用就是告诉系统:“去这些目录里找可执行文件”,配好之后你在任何位置敲adb都能直接运行。
第三,Homebrew 虽然是首选,但它依赖网络和包管理生态。Homebrew 安装 ADB 的本质是从远程仓库下载android-platform-tools这个 formula,然后解压到/opt/homebrew(Apple Silicon)或/usr/local(Intel)目录下,再自动帮你做好软链接。整个过程依赖网络通畅,一旦下载环节出问题,你就卡住了。
理解了这三点,你就能明白为什么“手动安装”这件事值得单独拿出来讲——它绕开了包管理器和网络依赖,把控制权完全交到你手里。
1.3 几种安装方式的横向对比
在正式进入操作之前,我先用一张表把几种方式的核心差异列出来,方便你根据自己的情况快速选择。
| 安装方式 | 适用场景 | 优点 | 缺点 | 难度 |
|---|---|---|---|---|
| Homebrew | 网络正常、已装 Homebrew | 一条命令、自动配环境变量、易更新 | 依赖网络、Homebrew 本身可能出问题 | 低 |
| 手动下载官方包 | 网络受限、不想装包管理器 | 完全离线可控、版本明确 | 需手动配环境变量、更新麻烦 | 中 |
| Android Studio 附带 | 已装或打算装 Android Studio | 顺带就有、版本匹配 | 体积大、启动慢 | 低 |
| SDK Manager 单独拉取 | 需要多版本管理 | 可管理多个 SDK 版本 | 需先有 SDK 工具、步骤多 | 中高 |
这张表不是让你死记,而是帮你建立一个判断框架。接下来我会逐个展开,把每一步都讲到位。
2. 手动下载官方工具包:最可控的安装方式
2.1 去哪里下载,下载哪个版本
手动安装的第一步是拿到官方工具包。这里有个关键点:一定要从官方渠道下载,不要随便在第三方网站下,因为 ADB 工具包里有可执行文件,来源不明的包存在安全风险。
官方下载地址是 Google 的 Android 开发者网站,搜索“Android SDK Platform-Tools”就能找到。页面会根据你的操作系统自动推荐对应版本。Mac 用户要注意区分芯片类型:Intel 芯片和 Apple Silicon(M 系列)芯片下载的是不同的包。虽然理论上 Intel 版本在 M 系列上可以通过 Rosetta 转译运行,但既然有原生版本,就没必要绕这个弯。
下载下来是一个 zip 压缩包,文件名类似platform-tools-latest-darwin.zip。这里的darwin就是 macOS 的系统代号,看到这个词就说明下对了。
提示:如果你在公司网络下访问官方下载页有困难,可以尝试在个人设备上下载后通过合规方式传输,或者使用 Android Studio 自带的 SDK Manager 来获取,具体见后面章节。
2.2 解压到哪个目录最合适
下载完成后,双击解压,你会得到一个名为platform-tools的文件夹。接下来的问题是:这个文件夹放哪里?
我的建议是放在用户主目录下的一个固定位置,比如/Users/你的用户名/Library/Android/sdk/platform-tools,或者简单点直接放/Users/你的用户名/platform-tools。为什么不建议放桌面或下载文件夹?因为这两个地方你迟早会清理,一旦移动或删除,环境变量就失效了,到时候adb命令报command not found,你还得重新排查。
如果你打算长期做安卓开发,我更推荐建立一个统一的 SDK 目录结构,比如:
/Users/你的用户名/Library/Android/sdk/ ├── platform-tools/ ├── build-tools/ ├── emulator/ └── ...这样所有安卓相关的工具都集中在一处,管理起来清晰。Library目录在 Finder 里默认是隐藏的,你可以按Command + Shift + .切换显示隐藏文件,或者在终端里直接用mkdir -p创建。
创建目录并移动文件夹的命令大概是这样:
mkdir -p ~/Library/Android/sdk mv ~/Downloads/platform-tools ~/Library/Android/sdk/执行完可以用ls ~/Library/Android/sdk/platform-tools确认一下,里面应该有adb、fastboot等文件。
2.3 环境变量配置的三种写法与选择
这是整个手动安装里最关键、也最容易出错的一步。环境变量配置的核心目的只有一个:让你在任何目录下敲adb都能被系统找到。
Mac 上配置环境变量有几个不同的文件可以选择,很多人在这里犯迷糊,我先把它们的关系理清楚。
macOS 从 Catalina 版本开始默认使用 zsh 作为 shell,所以你的配置文件是~/.zshrc。如果你还在用 bash,那对应的是~/.bash_profile。这两个文件在用户主目录下,是隐藏文件。你可以用open -e ~/.zshrc直接用文本编辑器打开,或者用nano ~/.zshrc在终端里编辑。
配置的写法有三种常见形式,我分别说明。
第一种,直接追加 PATH:
export PATH=$PATH:~/Library/Android/sdk/platform-tools这种写法最简单,把新目录追加到原有 PATH 的末尾。缺点是如果 PATH 里已经有其他版本的 adb,系统会优先用前面的那个。
第二种,前置 PATH:
export PATH=~/Library/Android/sdk/platform-tools:$PATH把新目录放在最前面,优先级最高。当你系统里存在多个 adb 版本时,这种写法能确保用的是你指定的这个。我个人更推荐这种。
第三种,先定义变量再引用:
export ANDROID_HOME=~/Library/Android/sdk export PATH=$PATH:$ANDROID_HOME/platform-tools这种写法多定义了一个ANDROID_HOME变量,很多安卓开发工具(比如 Gradle、Flutter)会读取这个变量来定位 SDK。如果你只是用 ADB 调试,前两种就够了;如果你要做完整开发,建议用第三种。
注意:
~符号在 PATH 配置里能否正确展开,取决于 shell 的解析。为了保险,你可以写成完整的绝对路径,比如/Users/你的用户名/Library/Android/sdk/platform-tools,避免因为波浪号解析问题导致配置失效。
2.4 让配置立即生效并验证
改完配置文件后,新开的终端窗口会自动加载,但当前已经打开的窗口不会。你需要手动让它生效:
source ~/.zshrc然后验证是否配置成功:
which adb adb versionwhich adb应该输出你配置的那个路径,adb version应该打印出版本号和修订号。如果which adb没有任何输出,说明 PATH 没配好;如果输出了路径但adb version报错,可能是文件权限问题,可以用chmod +x给 adb 文件加上执行权限。
这里有个我踩过的坑要提醒:如果你之前用 Homebrew 装过 ADB,后来又手动装了一个,系统里就会存在两个 adb。这时候which adb的结果取决于 PATH 的顺序。排查版本冲突时,先用which -a adb列出所有找到的 adb 路径,再决定保留哪个、删掉哪个。
3. 借助 Android Studio 和 SDK Manager 安装
3.1 Android Studio 顺带安装的便利与代价
如果你本来就要做安卓开发,那装 Android Studio 是最省事的路子。安装过程中它会引导你下载 SDK,其中就包含 platform-tools。装完之后,ADB 通常位于~/Library/Android/sdk/platform-tools/目录下,你只需要把这个目录加进 PATH 就行,配置方法和上一章完全一样。
但这里有个很多人不知道的细节:Android Studio 默认不会自动帮你把 platform-tools 加进 PATH。它只是把文件下载到那个目录,环境变量还是得你自己配。所以经常有人装完 Android Studio,在终端里敲adb还是提示找不到命令,原因就在这里。
Android Studio 的代价是体积大。完整安装包加上 SDK、模拟器镜像,轻松占掉十几个 GB。如果你只是偶尔用一下 ADB 抓个日志,为这个装一整套 IDE 有点杀鸡用牛刀。但如果你已经在用或者打算用,那顺带解决 ADB 是很自然的选择。
3.2 用 SDK Manager 单独拉取 platform-tools
不想装完整的 Android Studio,但又想用官方的 SDK 管理机制?可以用命令行版的 SDK Manager。这个工具叫sdkmanager,包含在commandlinetools包里。
流程是这样的:先从官方下载commandlinetools包,解压到一个目录,比如~/Library/Android/sdk/cmdline-tools/latest/。然后运行:
sdkmanager "platform-tools"它会自动下载 platform-tools 到 SDK 目录下。这种方式的优势是你可以用sdkmanager --list查看所有可用组件,用sdkmanager --update统一更新,适合需要管理多个 SDK 版本的人。
不过sdkmanager本身依赖 Java 运行环境,你得先装好 JDK。这就引出了另一个常见问题——JDK 环境变量配置。很多人装完 JDK 后java -version能跑,但sdkmanager还是报找不到 Java,原因通常是JAVA_HOME没配。这个变量的配置逻辑和 PATH 类似,在~/.zshrc里加上:
export JAVA_HOME=$(/usr/libexec/java_home -v 1.8) export PATH=$PATH:$JAVA_HOME/bin/usr/libexec/java_home是 macOS 自带的一个小工具,能自动定位已安装的 JDK 路径,比手写绝对路径靠谱得多。-v 1.8指定版本,不写就返回默认版本。
3.3 多版本共存时的路径优先级处理
当你同时存在 Homebrew 版、手动版、Android Studio 版 ADB 时,路径优先级就成了必须处理的问题。系统查找可执行文件的顺序就是 PATH 里目录的排列顺序,从左到右。
假设你的 PATH 是这样的:
/opt/homebrew/bin:/usr/local/bin:/Users/you/Library/Android/sdk/platform-tools那系统会先用/opt/homebrew/bin/adb,因为它在最前面。如果你想让手动版优先,就得把 platform-tools 目录挪到最前面。
排查这类问题的标准动作是:
which -a adb它会按 PATH 顺序列出所有 adb 的完整路径。看到结果后,你就能判断当前生效的是哪一个,以及是否需要调整顺序。
提示:不同版本的 ADB 和设备的兼容性可能有差异。如果遇到
adb devices显示unauthorized或者连接不稳定,可以试试换一个版本的 ADB,有时候问题就出在版本不匹配上。
4. 环境变量配置的深水区与常见报错
4.1 配置文件选错导致配置不生效
这是新手最常掉进去的坑。你在~/.bash_profile里认认真真配了 PATH,结果新开终端敲adb还是找不到。原因很简单:你的 shell 是 zsh,它读的是~/.zshrc,根本不看~/.bash_profile。
怎么确认自己用的是哪个 shell?敲:
echo $SHELL输出/bin/zsh就是 zsh,输出/bin/bash就是 bash。macOS Catalina 之后默认都是 zsh。如果你不确定,最稳妥的做法是两个文件都配上,反正重复配置也不会出错。
还有一个更隐蔽的情况:有些人用的是 fish 或者 oh-my-zsh 这类增强 shell,它们的配置文件路径又不一样。fish 的配置文件在~/.config/fish/config.fish,写法也完全不同。如果你装了这类工具,得查一下对应的配置方式。
4.2 PATH 拼接时的符号错误
PATH 配置里最容易写错的就是分隔符和变量引用。macOS 的 PATH 分隔符是冒号:,不是分号。我见过有人写成:
export PATH=$PATH;~/Library/Android/sdk/platform-tools这里分号在 shell 里是命令分隔符,等于把export PATH=$PATH和~/Library/...当成两条命令执行,第二条还会因为不是有效命令而报错。正确的写法必须是冒号。
另一个常见错误是漏掉$PATH:
export PATH=~/Library/Android/sdk/platform-tools这样写会把 PATH 完全覆盖掉,系统原有的所有命令路径都没了,结果就是ls、cd这些基础命令都用不了。遇到这种情况别慌,关掉终端重开一个,或者用绝对路径/bin/ls来操作,把配置改回来就行。
4.3 权限问题与 Gatekeeper 拦截
从网上下载的可执行文件,macOS 的 Gatekeeper 安全机制可能会拦截。你敲adb的时候如果报cannot be opened because the developer cannot be verified,需要去“系统设置 - 隐私与安全性”里手动允许,或者在终端里执行:
xattr -d com.apple.quarantine ~/Library/Android/sdk/platform-tools/adb这条命令的作用是移除文件的隔离属性,让系统不再拦截。官方下载的包一般不会有这个问题,但如果你从其他渠道拿到的工具包,可能会遇到。
权限问题还体现在文件的可执行位。正常情况下解压出来的 adb 文件应该已经有执行权限,但某些解压工具可能会丢掉这个属性。用ls -l adb看一下,如果权限位里没有x,就执行:
chmod +x ~/Library/Android/sdk/platform-tools/adb4.4 常见报错速查表
我把这些年遇到过的 ADB 相关报错整理成一张表,方便你对照排查。
| 报错信息 | 可能原因 | 解决方向 |
|---|---|---|
command not found: adb | PATH 未配置或配置未生效 | 检查配置文件、执行 source |
adb: cannot execute binary file | 下载了错误架构的包 | 确认芯片类型,重新下载 |
unauthorized | 设备未授权调试 | 手机上确认授权弹窗 |
no devices/emulators found | 设备未连接或驱动问题 | 检查数据线、开启 USB 调试 |
cannot be opened because... | Gatekeeper 拦截 | 移除 quarantine 属性 |
more than one device | 多设备同时连接 | 用-s指定设备序列号 |
adb server version doesn't match | 客户端与服务端版本不一致 | 杀掉 adb server 重启 |
这张表建议收藏,下次遇到报错先对照一遍,能省下大量搜索时间。
5. 装好之后:ADB 常用操作与实战技巧
5.1 连接设备与基础命令
ADB 装好配好之后,第一件事是确认能连上设备。用数据线把安卓设备连到 Mac,然后在设备上开启“开发者选项”里的“USB 调试”。不同品牌开启方式略有差异,一般是在“关于手机”里连续点击“版本号”七次激活开发者选项。
连接后执行:
adb devices正常应该输出类似:
List of devices attached ABCD1234 device如果显示unauthorized,说明设备上还没确认授权弹窗,解锁手机点“允许”即可。如果列表是空的,检查数据线是否支持数据传输(有些线只能充电)、USB 调试是否真的开了。
几个高频命令我列一下:
adb install app.apk # 安装应用 adb uninstall com.example # 卸载应用 adb logcat # 查看实时日志 adb shell # 进入设备 shell adb pull /sdcard/file . # 从设备拉取文件 adb push file /sdcard/ # 推送文件到设备 adb reboot # 重启设备5.2 用 logcat 抓日志的正确姿势
adb logcat是排查应用问题最常用的工具,但直接敲它会刷屏,信息量太大。我一般会配合过滤条件使用。
按标签过滤:
adb logcat -s TAG_NAME按优先级过滤,只看错误以上级别:
adb logcat *:E把日志输出到文件:
adb logcat > log.txt如果要抓取崩溃日志,可以先清空缓冲区再操作:
adb logcat -c adb logcat > crash.log然后复现问题,抓完按Ctrl + C停止。这样日志文件里就只有问题发生前后的记录,排查起来清爽很多。
提示:
adb logcat -c清空的是设备端的日志缓冲区,不是清空你的终端。这个操作不可逆,清空前确认不需要之前的日志。
5.3 无线调试与多设备管理
Android 11 之后支持无线调试,不用数据线也能连。先在设备上开启“无线调试”,它会显示一个 IP 和端口,然后:
adb pair 设备IP:配对端口 adb connect 设备IP:调试端口配对码在设备上会显示,输入即可。连上之后adb devices就能看到无线设备了。
多设备同时连接时,所有命令都需要用-s指定设备序列号:
adb -s ABCD1234 install app.apk序列号就是adb devices列出来的那一串。如果嫌麻烦,可以设置环境变量ANDROID_SERIAL指定默认设备。
5.4 几个提升效率的小技巧
第一个技巧,用adb shell配合管道做批量操作。比如批量卸载某个前缀的应用:
adb shell pm list packages | grep com.example | cut -d: -f2 | xargs -n1 adb uninstall第二个技巧,截图和录屏。adb exec-out screencap -p > screen.png可以直接把设备屏幕截图保存到电脑,比先存到设备再 pull 出来快得多。录屏用adb shell screenrecord /sdcard/demo.mp4,按Ctrl + C停止后 pull 出来。
第三个技巧,修改屏幕刷新率做测试。有些设备支持通过 ADB 切换刷新率:
adb shell settings put system peak_refresh_rate 60 adb shell settings put system min_refresh_rate 60测试完记得改回去,不然设备会一直跑在低刷新率下。
6. 卸载残留清理与版本维护
6.1 Homebrew 卸载 ADB 后的残留处理
如果你之前用 Homebrew 装过 ADB,后来想换成手动版,卸载命令是:
brew uninstall android-platform-tools但 Homebrew 卸载后可能会留下一些缓存和软链接。缓存目录在~/Library/Caches/Homebrew/,可以定期清理。软链接一般在/opt/homebrew/bin/或/usr/local/bin/下,卸载后如果还残留adb的软链接,会导致which adb指向一个不存在的文件。用ls -l检查一下,发现断链就手动删掉。
彻底清理 Homebrew 残留是个大工程,涉及/opt/homebrew、/usr/local、~/Library/Caches/Homebrew、~/Library/Logs/Homebrew等多个位置。如果你只是想换 ADB 的安装方式,没必要把 Homebrew 整个清掉,只处理 ADB 相关的残留就够了。
6.2 手动安装版的更新方法
手动安装的 ADB 更新起来没有 Homebrew 那么方便,需要重新下载最新包,解压后覆盖旧目录。覆盖前建议先备份一下旧版本,万一新版本有问题可以回退。
更新步骤:
# 备份旧版本 mv ~/Library/Android/sdk/platform-tools ~/Library/Android/sdk/platform-tools.bak # 解压新版本到原位置 unzip ~/Downloads/platform-tools-latest-darwin.zip -d ~/Library/Android/sdk/ # 验证 adb version确认新版本正常后,再删掉备份目录。如果新版本有问题,把备份改回来就行。
6.3 版本选择的一点经验
ADB 的版本并不是越新越好。新版本可能引入一些行为变化,导致和老设备或老工具链不兼容。我的经验是:如果你的设备和工作流都正常,不要频繁更新 ADB。遇到具体问题时再针对性升级。
另外,ADB 客户端和服务端的版本要匹配。如果你电脑上的 adb 版本和某个工具内置的 adb 版本差太多,可能会出现adb server version doesn't match的报错。解决办法是杀掉当前 server 再重启:
adb kill-server adb start-server这样会用你当前 PATH 里的 adb 重新启动服务端,版本就统一了。
7. 一些容易被忽略的细节
7.1 关于 Mac 地址和网络工具
搜索热词里出现了“mac地址怎么查”和“technitium mac address changer”这类词,我顺带说一句。Mac 地址是网卡的物理地址,查看方法是“系统设置 - 网络 - 详细信息 - 硬件”,或者在终端里用ifconfig命令查看ether后面的那串。修改 Mac 地址属于网络层面的操作,和 ADB 调试没有直接关系,这里就不展开了,只是提醒别把这两个“Mac”搞混——一个是苹果电脑,一个是网卡地址。
7.2 模拟器场景下的 ADB
如果你用夜神模拟器或者其他安卓模拟器,它们通常自带 ADB 服务。模拟器启动后,用adb connect 127.0.0.1:端口号就能连上。不同模拟器端口不同,夜神一般是 62001,雷电是 5555。连上之后操作和真机一样。
需要注意的是,模拟器自带的 ADB 版本可能和你系统里的不一致。如果连接出问题,可以试试用模拟器目录下的 adb 来操作,或者统一用系统里的版本。
7.3 精简列表与权限操作
热词里提到的“vivo adb精简列表”和“adb解除安装权限”,本质上是利用 ADB 的pm(package manager)命令来管理系统应用。比如禁用某个预装应用:
adb shell pm disable-user --user 0 包名恢复:
adb shell pm enable 包名卸载预装应用(对当前用户):
adb shell pm uninstall --user 0 包名这些操作有风险,禁用或卸载系统关键应用可能导致设备异常。操作前一定要确认包名对应的应用是什么,不确定的不要动。建议先pm list packages列出所有包,找到目标后再操作。
注意:不同品牌对 ADB 权限的限制不同,有些操作在部分设备上会被拒绝。遇到
SecurityException或Permission denied,说明该操作被系统策略拦截了,不要强行绕过。
7.4 环境变量配置失败的自查清单
最后给一个环境变量配置失败的自查清单,按顺序排查基本能定位问题:
- 确认 shell 类型:
echo $SHELL - 确认配置文件正确:zsh 用
~/.zshrc,bash 用~/.bash_profile - 确认配置语法正确:PATH 用冒号分隔,保留
$PATH - 确认配置已生效:
source ~/.zshrc后echo $PATH - 确认文件存在且有执行权限:
ls -l看权限位 - 确认没有多个版本冲突:
which -a adb - 确认 Gatekeeper 没拦截:必要时移除 quarantine 属性
这七步走完,绝大多数环境变量问题都能解决。如果还不行,把echo $PATH和which -a adb的输出贴出来,基本就能看出问题在哪了。
我在实际使用中的体会是,ADB 这类命令行工具的安装,难点从来不在工具本身,而在环境配置和版本管理这些“周边”问题上。把 PATH 理顺、把版本统一、把残留清干净,后面用起来就是一劳永逸的事。手动安装虽然比 Homebrew 多几步,但每一步都看得见摸得着,出了问题也知道去哪里找原因,这种掌控感在排查疑难问题时特别有价值。