开头不用加了元信息,直接从标题内容开始。我需要确保全文有多个H2部分,每个部分有足够的深度,且语言自然生动,像资深开发者在分享踩坑经历。
注意标题层级:不要跳级,H2编号,H3编号。内容要够5000字。
我现在开始规划结构:
- 开头:描述问题现象和影响面(聊自己看到一堆人问这个问题,通俗引入)
1. 先搞清楚模拟器为什么不跑:现象与根因拆解
1.1 现象面面观:安静崩溃还是异常报错
1.2 罪魁祸首排查:三条主线
2. 深入内核:是权限还是系统保护在捣乱
2.1 Hypervisor框架权限:模拟器的重要依赖
2.2 终端工具的Full Disk Access权限
2.3 系统完整性和老版本模拟器的兼容问题
3. 实操修复:从轻到重的完整步骤
3.1 第一步:升级Android SDK/模拟器组件
3.2 第二步:配置正确的JDK版本
3.3 第三步:命令行启动模拟器,锁定真实错误
3.4 第四步:处理权限与内核扩展
3.5 第五步:系统SIP的灰度操作
3.6 第六步:换用稳定版系统镜像或物理设备
4. 常见报错速查:看到什么信息怎么对症下药
4.1 报错信息对照表
4.2 冷门但致命的隐藏坑
5. 个人经验总结与避坑建议
- 也许不需要很多H3,但至少两个小节。
现在开始写,保证段落自然,有细节,有命令,有理由解释。
注意不要使用“通过本文”、“随着...发展”等套路。我准备直接用故事化、经验式的口吻开始。
我需要非常小心地确认内容中没有违规或不安全内容。这个主题完全无关政治、无关违规。OK.
现在正式创作内容。 写这篇东西的起因很简单,上个月帮我身边的开发者朋友排查问题,一上午就碰到三个人的安卓模拟器在 MacOS Big Sur 上新装完或者系统升级完,突然就起不来了。有的是启动后一直转圈然后闪退,有的是直接弹个 “Hax is not working” 或者 “Unable to boot the Android emulator”,还有的是终端下直接 crash,日志糊一屏幕。那场景大家都熟——一屋子人围着电脑,试着重启、重装 SDK、删镜像,老半天了还是不行,火气蹭蹭往上冒。
这个项目标题讲的就是“修复 MacOS Big Sur 下 Android 模拟器无法运行”。别看就几个字,踩过的坑一点都不小。Big Sur 是苹果把系统底层安全策略收得非常紧的一个大版本,从 T2 芯片和系统完整性保护(SIP)到各类内核扩展的权限管控,几乎全换了一套逻辑。安卓模拟器恰好是个又吃硬件虚拟化、又吃内核授权、还带着一整套 Java/Android SDK 老链路的“结合部”——三个环节一叠加,问题就特别容易连环爆。
所以今天不写那种“卸载重装一次就好了”的指导,没营养。我要把你可能遇到的所有报错、背后的原因、修复的每一步,以及我自己踩过的那些官方文档压根不会写的小坑,全部摊开聊一遍。内容主要针对 MacOS Big Sur(Intel 和 Apple Silicon 都会涉及),Android Studio 模拟器 / SDK 自带模拟器,适合正在被这个问题折磨的移动端开发者、测试同学,以及自建 CI 环境跑模拟器的团队。
1. 先搞清楚模拟器为什么不跑:现象与根因拆解
很多人在模拟器崩了之后,第一反应是重新创建 AVD、删除重建虚拟机镜像,一顿操作猛如虎,结果全部白干。为什么?因为压根还没定位到这一次到底是哪个环节崩了。想快速修复,第一步不是盲目试,而是先把“现象”和“原因”对上号。
1.1 现象面面观:安静崩溃还是异常报错
模拟器出问题,不是每一次都会明明白白报一句“你缺了什么”。我归纳了一下,Big Sur 下最常见的现象有这么几种:
- 点 Android Studio 里的运行按钮,模拟器窗口刚出现一个虚影,还没看到桌面就整个消失。
- 模拟器窗口在,但是一直卡在启动画面或者转圈,十几分钟不动,最后只能强制退出。
- 有报错弹窗,最经典的就是
HVF is not supported、Hax kernel extension is not installed这种。 - 完全没画面,直接命令行里 crash,日志里出现类似
Abort、Segmentation fault、Opening GL相关字样。 - 还有一种很隐蔽的:模拟器能开,但是极其卡,CPU 直接占满,跟死机一样。
这些现象背后,对应的原因其实完全不一样。如果你自始至终只看到“模拟器废了”这一件事,那你就没法针对性地修。
我把它们归成三条主线:系统权限和完整性保护层、SDK/镜像版本兼容层、JDK/Java 工具链层。模拟器跑不起来,九成以上都能套进这三条主线里。
1.2 罪魁祸首排查:三条主线
三条主线的定位方法,其实靠观察就能完成:
第一类是权限和完整性保护层。这类问题通常出现在系统刚升完 Big Sur 之后,模拟器直接闪崩或者 HVF 报错,因为原来的内核扩展授权状态被系统重置了,或者说你的电脑在 T2/Apple Silicon 芯片上对底层虚拟机框架做了更严格的管控。修起来很耗时间。
第二类是 SDK/镜像版本兼容层。新版操作系统往往要求模拟器、系统镜像、Android SDK 平台工具必须更新到特定版本,如果你还在用老旧的模拟器程序和非常老的 API Level 镜像,在新系统上兼容性就是会出问题,这是硬性的,绕不过去。
第三类是 JDK 工具链层。Android 模拟器在启动时需要检测到正确版本的 JDK,如果JAVA_HOME指向了太老的版本,或者你装了多套 JDK 导致启动脚本取错了环境变量,那模拟器就会马斯克式地“先卡后崩”,无规律,靠感觉排查累死人。
这三条主线我先提出来,下边每一章节都会展开讲完全对应的处理方法。你在看的时候不用急着动手,先想想自己属于哪种现象、哪个版本、什么环境,再跳转到对应小节尝试修复,效率会高很多。
2. 深入内核:是权限还是系统保护在捣乱
先说这段是因为 Big Sur 上模拟器跑不动,大多数和“权限/内核框架”脱不开关系。这章聊的东西有点底层,我尽量讲通俗,但该到的细节不会省,因为这些都是官方文档里一笔带过、但实际排查时最要命的点。
2.1 Hypervisor 框架权限:模拟器的重要依赖
不管是 Intel 平台的 HAXM/HVF,还是 Apple Silicon 平台上的模拟器虚拟机加速,本质上都是借助苹果的 Hypervisor.framework 实现轻量级虚拟化。Big Sur 对这一层做了两件大事:第一是完整性保护更严,第二是授权机制和早期 macOS 不一样。
在 Intel 的 Mac 上,模拟器可以用两种加速方案:一种是英特尔的 HAXM,老项目里很常见;另一种是直接用 macOS 自带的 Hypervisor.framework,Android 模拟器文档里管这个叫“HVF”。在 Big Sur 之前,装好 HAXM 驱动一般就能跑,但 Big Sur 以后,基于老版本 HAXM 的驱动会因为内核扩展签名校验、加载策略的原因失效,现象就是“HAXM is not working”或者/dev/nexus设备不可用。
在 Apple Silicon 的 Mac 上,不存在 HAXM,全靠 Hypervisor.framework。理论上性能很好,但前提是系统必须允许当前终端进程或者 Android Studio 进程使用 hypervisor 权限。如果进程权限不够,模拟器就起不来。
所以这一层的问题,本质上是“系统允不允许模拟器借用虚拟化能力”。不是模拟器有问题,是你系统层面没放行。
2.2 终端工具的 Full Disk Access 权限
这是一个极少有人提,但特别容易卡住人的点。Big Sur 对“隐私与安全性”里面的各类权限做了细分,其中“完全磁盘访问权限”是很多命令行工具的隐型门槛。
你可能想不通:模拟器和磁盘访问有什么关系?关系大得很。模拟器虽然主要在内存/CPU里干活,但启动时需要读取 AVD 的配置、读取系统镜像、写入用户数据镜像到~/.android/avd,如果终端进程或者 Android Studio 的辅助进程没有完全磁盘访问权限,系统就会拦截掉很多底层读写的操作请求。结果就是你的 AVD 配置看起来是对的,但实际运行时总缺胳膊少腿,各种诡异的读盘失败、启动超时。
实际操作中,我遇到过一个非常典型的案例:某开发者在终端里通过命令行工具启动模拟器,日志一直在报 “Failed to load snapshot” 或者 “Cannot read AVD config”,但文件确实存在。就是因为他用的终端模拟器本身没有被授予完全磁盘访问权限。
所以这一节虽然听着和数据安全这些高大上话题沾不上边,但真的是 Big Sur 时代绕不开的一个小坑。
2.3 系统完整性和老版本模拟器的兼容问题
老版本的 Android 模拟器可能高度依赖未经苹果认可的私有接口,或者说依赖的方式在 Big Sur 里已经变成违规操作。系统完整性保护一开,这些操作直接就被按住了。这里可以这么理解:Big Sur 就像一栋物业突然把安保等级提到了最高,以前你拿业主卡就能进的设备间,现在必须登记、刷脸、且只能在特定时间进入——你的老模拟器还揣着以前那套门禁卡,自然进不去了。
要不要关掉 SIP(系统完整性保护),这里我谨慎地讲一句:如果你是在可控的开发和测试机器上,且明确知道自己项目依赖老版本模拟器、暂无条件升级镜像或 SDK,那么临时关闭 SIP 可能是“能跑起来”的唯一手段。但这绝不是什么轻松的决定,它会导致整机安全性下降。不推荐普通用户这么做,尤其不要在公司配发的电脑上悄悄关。后面实操部分我会写清楚具体命令和注意事项,但前提一定是:你知道你在做什么,并且能承担风险。
这一章总结下来就是一句话:Big Sur 的底层规则变了,你原来那套“能跑就行”的环境,在新系统上可能就是不行。与其硬顶着不改,不如先看自己要怎么适配。
3. 实操修复:从轻到重的完整步骤
这里写的步骤是按照“由轻到重、从常规排查到高级操作”的顺序组织的。每一项都是可以直接复制命令跑的,跑之前看清楚说明。
我的建议是不要跳着看,至少先把第一步和第二步做了,再看看你的报错是否消失。很多问题其实没有那么复杂。
3.1 第一步:升级 Android SDK / 模拟器组件
在 Big Sur 上,最省心也最容易被忽视的修复方法,是升级到 Android Studio 自带的最新版 SDK 平台工具和模拟器组件。理由很简单:新版本模拟器对 Big Sur 的适配比老版本完善得多。
你可以这样做:
- 打开 Android Studio,进入
SDK Manager。 - 在
SDK Tools选项卡里,找到Android SDK Platform-Tools和Android Emulator。 - 如果有可用更新,直接勾选升级,应用之后等待下载完成。
如果你使用的是命令行工具管理 SDK,那也可以用sdkmanager来更新:
sdkmanager --update sdkmanager --list | grep emulator sdkmanager "emulator" "platform-tools"另外,我建议把系统镜像也一并检查。模拟器正在使用的系统镜像(比如system-images;android-30;google_apis;x86或arm64-v8a),最好更新到当前 SDK 管理器里提供的最新补丁版本。有些镜像在 Big Sur 之前发布,内核模块或者渲染方式可能和 Big Sur 的图形栈不兼容。
升级完之后,去 AVD 管理器里把已经存在的虚拟机冷启动一次。冷启动的方式是启动时勾选-wipe-data,或者直接用命令:
emulator -avd 你的AVD名字 -wipe-data手动强制擦除用户数据,等于把之前已经损坏的镜像状态清掉,很多时候第一步到这里模拟器就能跑起来了。
3.2 第二步:配置正确的 JDK 版本
模拟器本身是用 C++ 写的,但它外层那套启动器和 Android Studio 构建流程依赖 JDK。如果你环境里 JDK 版本太老,或者JAVA_HOME指向的是系统自带的老版 JDK,启动时很容易出现无法加载主类、崩溃、或者后台进程被杀的问题。
我个人的建议是使用 OpenJDK 11 或 17,至少在 Big Sur 上都够稳。不要用 Java 8,部分新版本模拟器组件是编译到更高字节码版本的,Java 8 直接 class version 不兼容,连启动都会报错。
先检查当前环境变量:
echo $JAVA_HOME java -version如果 Java 版本不对,可以用 Homebrew 安装新的 JDK:
brew install openjdk@17然后设置环境变量。因为 macOS 的zsh是默认 shell,建议你在~/.zshrc里加上:
export JAVA_HOME=/usr/local/opt/openjdk@17/libexec/openjdk.jdk/Contents/Home export PATH="$JAVA_HOME/bin:$PATH"如果你用的是 Android Studio 自带的 JBR(JetBrains Runtime),也可以直接在 Android Studio 里配置 Gradle JDK 为 Embedded JDK。但这里要说清楚:Android Studio 内嵌 JDK 只影响 Gradle 构建,不一定影响命令行启动模拟器的环境。如果你后续需要用命令行启动,最好还是把全局JAVA_HOME配好。
改完记得:
source ~/.zshrc然后重新尝试启动模拟器。
3.3 第三步:命令行启动模拟器,锁定真实错误
这是整个排查流程里我最推荐的一步,也是很多人跳过的关键一步。从 Android Studio 里点运行按钮启动模拟器,虽然方便,但会吞掉很多原始日志,报错信息不完整。真正有用的错误日志,全在终端里。
先找到模拟器和 AVD 列表:
emulator -list-avds然后启动模拟器并保留完整日志输出:
emulator -avd 你的AVD名字 -verbose -no-snapshot -no-boot-anim这里面几个参数的意义:
-verbose:输出尽可能详细的日志,启动过程中每一个环节有没有通过都会显示。-no-snapshot:跳过快速启动快照,强制完整启动,避免加载损坏的旧快照。-no-boot-anim:关掉开机动画,能减少一些图形渲染压力,在某些图形问题中能帮助快速定位。
这样启动时,终端会滚动出一大堆日志。重点看有没有这几个字样:
HVF/HAXM/Hypervisor/Failed to open /dev/nexuscrashGL/GPUPermission denied
看到具体报错之后,再去对症下药,总比盲修强一百倍。
3.4 第四步:处理权限与内核扩展授权
在确认报错和虚拟化/权限相关之后,按下面的顺序处理。
首先给终端(或者你启动模拟器用的那个 App)开启完全磁盘访问权限:
- 打开“系统偏好设置” -> “隐私与安全性” -> “完全磁盘访问权限”。
- 点击左下角锁头解锁。
- 点 + 号,把终端(或 iTerm)加进去。
- 如果是通过 Android Studio 启动模拟器,建议把 Android Studio 也加进去。
- 添加完,一定要重启对应的 App 才会生效。
这一步做完,很多文件访问类的诡异问题会消失。
如果你是 Intel Mac 并且需要 HAXM,检查一下驱动是否真的能用:
kextstat | grep intel看有没有com.intel.kext.intelhaxm字样。如果没有,那说明装好了也没被加载。Big Sur 对老版本内核扩展的限制很大,尽量去下载适配 Big Sur 的最新版 HAXM 安装包重新安装。安装完之后多半需要重启一次电脑,让驱动完成加载。
如果你是 Apple Silicon Mac,不需要 HAXM,直接确认你是不是在 Rosetta 环境下错误调用了 x86 版本模拟器。这里有个大坑:某些没有更新到最新版的 Android Studio 在 Apple Silicon 上仍会尝试运行 x86 模拟器二进制,然后模拟器就会尝试用 HVF 跑 x86 镜像,无论如何都跑不动。解决办法是下载arm64-v8a的系统镜像,并且在 AVD 里选择对应架构,确保你跑的是原生 ARM 镜像。
3.5 第五步:系统 SIP 的灰度操作
如果走到这一步,模拟器还是因为权限问题起不来,而你又明确知道自己需要老版本模拟器,那才轮到考虑 SIP 的事情。
先说明风险:关闭 SIP 意味着系统对内核扩展、文件系统保护、运行时注入的防护全面弱化。对于公司电脑或者生产环境,我不建议做这一步。它应该是最后手段而不是首选方案,而且等到修复完,最好立刻重新开启。
如果你决定要做,操作流程如下:
- 关机,然后按住电源键进入“启动选项”界面(Apple Silicon),或者在开机时按住 Command + R(Intel)。
- 进入恢复模式之后,打开“实用工具” -> “终端”。
- 输入命令查询当前状态:
csrutil status- 如果要关闭,输入:
csrutil disable- 重启电脑。
但这里我尤其要强调一点:Big Sur 下,即使关了 SIP,老 HAXM 也未必能恢复工作,因为还存在内核扩展签名和原生架构匹配的问题。所以不要指望“关掉 SIP 就能一步到位”。关 SIP 只是清除了一个门槛,后面还有别的门槛等着你。
修复完成后想重新打开 SIP,同样的步骤,命令换成:
csrutil enable我的实际经验是:十次里有八次,问题出在模拟器和 SDK 版本太老,而不是 SIP 本身。大家不要一上来就关闭系统保护,这不只影响安全,还可能后续影响系统增量更新,得不偿失。
3.6 第六步:换用稳定版系统镜像或物理设备
如果软件层面的方法都试光了,模拟器还是动不动就崩,那就要聪明一点,不要死磕。Big Sur 下的图形渲染栈变化很大,某些老的 x86 镜像里的 GPU 驱动模型和宿主机已经完全对不上了。这种情况与其花一个下午去折腾一个注定不稳定的组合,不如换个思路:
- 用 Android Studio 里自带的高版本镜像,比如 API 30 或 33/34 的 google_apis 镜像,往往比老版本镜像稳得多。
- 把 AVD 的图形渲染方式切换成
Swiftshader(软件渲染),虽然性能差一些,但至少能启动,适合做基础测试。 - 如果项目对稳定性要求很高,比如 UI 自动化跑回归测试,建议直接用物理设备。一台几百块钱的安卓真机,比你在模拟器上省下的人力成本划算多了。
我不是要劝退模拟器,但在特定场景下,物理设备确实是性价比更高的方案。
4. 常见报错速查:看到什么信息怎么对症下药
把我在排查中遇到的、以及网上高频出现的一些报错集中整理一下。以后你看到某一类日志,直接对照表格找方向就行,省得翻文档翻到头大。
| 报错信息 / 关键字 | 大概率原因 | 直接对策 |
|---|---|---|
HVF is not supported | 当前 Mac 的 Hypervisor.framework 访问受限,或系统保护拦截 | 检查 SDK 和模拟器版本,升级;确认当前终端有权限;Apple Silicon 确认用 arm64 镜像 |
Hax kernel extension is not installed | Intel HAXM 驱动没装好或未加载 | 重装适配 Big Sur 的 HAXM,重启后再试 |
Failed to open /dev/nexus | HAXM 驱动加载失败 | 看kextstat,确认内核扩展存在;必要时重装 |
/dev/hv_service或failed to connect to hvf | HVF 权限问题 | 关闭或调整安全策略,或升级到新版模拟器 |
Failed to load snapshot | 旧快照损坏 | 启动加-no-snapshot,或运行-wipe-data |
GL error/GPU emulation failed | 图形渲染栈冲突 | 在 AVD 配置里切为软件渲染或修改 GPU 模式 |
Segmentation fault | 镜像或模拟器二进制与系统不兼容 | 升级模拟器、换镜像版本 |
Cannot find AVD system path | SDK 路径配置不完整 | 检查ANDROID_SDK_ROOT或ANDROID_HOME环境变量 |
Out of memory | AVD 内存配置过高 | 降低 AVD 内存设置,或者关掉一些后台大应用 |
Warning: user data image already in use | 多开冲突 | 关闭另一个模拟器进程,或者adb kill-server |
Process crashed后无日志 | 新版组件依赖 JDK 高版本 | 配置 JDK 11+,重开终端 |
这些报错不是全部情况,但覆盖了八成以上的实际问题。遇到问题时不要被一串串日志吓到,从第一行错误,尤其从Failed、Error、Cannot开头的位置开始看,通常那个位置的上一行就是罪魁祸首。
4.1 日志背后的隐藏线索
除了报错本身,我还要提醒大家看日志时注意两件事。
第一,观察崩溃时间点。是启动后立刻崩溃,还是加载到一半崩溃?启动后立刻崩溃大概率是系统权限或内核接口问题;加载到一半崩溃,大概率是镜像数据或图形渲染问题。这个判断能帮你缩小排查范围。
第二,观察日志里有没有panic、abort、signal字样。如果有,说明模拟器进程是被底层信号干掉的,不是普通的 Java 异常。这种情况一般是宿主机层面的问题,和你的项目代码无关,没必要去改应用代码。
4.2 冷门但致命的隐藏坑
有几个坑排除了上述所有问题之后依然可能出现,我以前也被折腾过,这里特别列出来。
第一个是~/.android/avd目录下的.ini文件路径不对。如果你对 AVD 做过重命名或者搬移到别的磁盘,.ini里记录的 path 可能还指向旧地址。模拟器启动时会去找镜像文件,结果路径不存在,然后闪退。解决方案是打开.ini文件,检查path=那一行,确保路径正确。
第二个是ANDROID_SDK_ROOT和ANDROID_HOME环境变量指向了不同的 SDK 路径。某些工具用前者,某些工具用后者,两边版本不一致就得出乱子。建议把两个变量统一:
export ANDROID_HOME=$HOME/Library/Android/sdk export ANDROID_SDK_ROOT=$HOME/Library/Android/sdk export PATH=$ANDROID_HOME/emulator:$ANDROID_HOME/platform-tools:$PATH第三个是模拟器渲染和 macOS 的窗口合成器冲突。某些 Big Sur 图形驱动版本对前台 GPU 加速支持不太好,模拟器启动后会因为 GPU 进程崩溃而整个退出。这种问题很玄学,换一个 AVD 的 GPU 模式通常能解决:
emulator -avd 你的AVD名字 -gpu swiftshader_indirect或者把 AVD 配置hw.gpu.enabled改为no,强制纯软件渲染,虽然动画会卡一点,但稳。
第四个是磁盘空间不足。Big Sur 本身占空间就不小,模拟器镜像又非常占空间,一个 AVD 至少好几个 GB。如果磁盘剩余空间低于 10GB,模拟器就会极其卡,甚至启动失败。这看起来不像技术问题,但实践中遇到太多次。检查一下:
df -h如果空间紧张,清理 Xcode 的缓存、旧版本模拟器下载缓存,都是很好的突破口。
5. 个人经验总结与避坑建议
聊到最后,我再啰嗦几句个人感受。写这篇东西之前,我自己也在 Big Sur 刚出来的时候吃过亏:项目组临时需要跑一套旧 API 的自动化测试,结果模拟器怎么都拉不起来,当时折腾到凌晨一点,最后发现只是 JDK 版本指向出了问题。那之后我养成了习惯:每次系统大版本更新前,先把开发环境的版本清单列一遍,尤其关注虚拟化相关组件。
我的建议有三条。
第一,系统大版本升级不是小事,不要立刻在主力开发机上折腾。如果你是团队里的基础设施负责人,先拿一台备用机器升级到最新系统,把模拟器、构建链、常用依赖都验证一遍,再考虑推广到全员。不然就等于拿全团队的生产力做测试。
第二,模拟器相关的问题,养成看日志的习惯。不管是在 Android Studio 里还是在命令行,日志永远比弹窗信息更有价值。弹窗只是表现,日志里藏着病因。把下面这行命令当成肌肉记忆,遇到模拟器问题先跑一遍:
emulator -avd 你的AVD名字 -verbose -no-snapshot -no-boot-anim第三,该换的时候就换,不要用情怀死撑。有些老项目里的旧系统镜像在 Big Sur 上就是跑不稳,你花一天去修它,不如直接更新到新版镜像,哪怕需要花一点时间适配应用代码,也是值得的。技术在往前走,模拟器也一样,抱着旧版本不放,只会让自己越来越被动。
如果你严格按照前面几个章节的步骤走下来,Big Sur 下模拟器不能运行的问题,九成以上都能解决。剩下那一成,要么是硬件不满足虚拟化要求,要么是系统环境被改得过于复杂,那种情况我只能说:清装系统,或者换一台机器,反而更快。
最后再分享一个我实测过好用的习惯:每次修复环境问题,把用到的命令、报错关键行、最终解决方案记录到一个本地的 Markdown 文件里,下次遇到直接搜索关键字。这个东西比收藏一堆网页、截图一堆聊天记录管用多了。毕竟 mac 系统版本还会更新,模拟器也会更新,问题只会变种,不会消失,你手里的排查笔记就是最值钱的资产。