如何解决 macOS Catalina 10.15.7 中最新 Android Studio Meerkat 启动模拟器 Unknown Error 的问题
大家好,今天我在 macOS Catalina 10.15.7 上使用最新版 Android Studio(代号 Meerkat)时,启动 Android 模拟器老是遇到"Unknown Error"的报错,搞得开发效率直线下降。作为一个常年在 macOS 上折腾 Android 开发的码农,我深知这种问题的烦人之处,今天就来跟大家分享一下我的解决经验,顺便详细讲讲如何通过命令行启动模拟器,希望能帮到你!
问题复现:从"Unknown Error"说起
先说说我遇到的情况吧。我在 macOS Catalina 10.15.7 上装了最新版的 Android Studio Meerkat,配置好 AVD(Android Virtual Device)后,满怀期待地点击启动项目的时候,结果屏幕一闪,模拟器跳出"Unknown Error"的错误。什么鬼?试了几次后,我开始怀疑是不是哪里配置错了,但检查了环境变量、AVD 设置,一切似乎都正常。这让我有点抓狂------新版工具怎么还不如老版本稳定呢?到底是什么问题引起的呢?
后来我尝试用命令行启动模拟器,结果发现更具体的错误信息,这让我逐渐摸到了一些线索。
前置准备:从命令行启动模拟器
在解决问题之前,我想先跟大家聊聊如何通过命令行启动 Android 模拟器,因为很多朋友可能更习惯用 Android Studio 的图形界面,但命令行其实更灵活,还能帮我们调试问题。
-
确保环境变量配置好
首先,得让终端认识 Android SDK 的工具。打开终端,编辑你的 shell 配置文件(我用的是 Zsh,所以是
~/.zshrc
,如果你用 Bash 就编辑~/.bashrc
),加入以下内容:bashexport ANDROID_HOME=~/Library/Android/sdk export PATH=$PATH:$ANDROID_HOME/emulator export PATH=$PATH:$ANDROID_HOME/tools export PATH=$PATH:$ANDROID_HOME/platform-tools
保存后,运行
source ~/.zshrc
让配置生效。可以用echo $ANDROID_HOME
检查是否设置成功。 -
查看可用 AVD
配置好环境后,输入以下命令列出你创建的虚拟设备:
bashemulator -list-avds
这会返回类似
Pixel_4_XL
这样的名字,就是你的 AVD 名。 -
启动模拟器
用这个命令启动指定的 AVD:
bashemulator -avd Pixel_4_XL
如果一切正常,模拟器就会弹出来。但如果像我一样遇到"Unknown Error",那就得接着往下看解决办法了!
问题排查:错误信息指向兼容性
我用命令行启动时,第一次遇到了这个错误:
bash
dyld: Symbol not found: __ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE
Referenced from: /Users/xxx/Library/Android/sdk/emulator/lib64/libabseil_dll.dylib (which was built for Mac OS X 12.7)
Expected in: /usr/lib/libc++.1.dylib
in /Users/xxx/Library/Android/sdk/emulator/lib64/libabseil_dll.dylib
zsh: abort emulator -avd Pixel_4_XL
这让我怀疑是版本兼容性问题,因为错误提到 Mac OS X 12.7
,而我的系统是 10.15.7,显然低了不少。于是我在网上查了查,有人建议降低 Emulator 版本,并推荐了官方的 Android Emulator 历史版本存档。我决定试试看。
解决方法:降低 Emulator 版本
根据 Android Emulator Archive 的指引,我尝试降低 Emulator 版本来解决问题。官方页面提供了详细的手动安装步骤,我按照以下方法操作,最终搞定了:
-
找到 SDK 安装目录
首先,我需要确认我的 Android SDK 安装路径。在 macOS 上,默认路径是
$HOME/Library/Android/sdk
,也就是/Users/xxx/Library/Android/sdk
。- 你可以在 Android Studio 中打开 Preferences > Appearance & Behavior > System Settings > Android SDK ,查看 Android SDK Location,确认具体路径。
- 如果用 Finder 浏览,Library 文件夹可能默认隐藏,可以通过 Finder 的 Go > Go to Folder 输入
~/Library
打开。
-
备份现有的 Emulator 文件夹
在 SDK 目录下有个
emulator
文件夹,我先把它改名备份一下,以免操作失误搞乱原文件。比如,我改成了emulator_original
:bashmv ~/Library/Android/sdk/emulator ~/Library/Android/sdk/emulator_original
-
下载并解压新版本
-
打开 Android Emulator Archive,我先试了
33.1.24
,下载对应的 macOS 压缩包。 -
解压后,把内容移动到 SDK 的
emulator
目录下:bashunzip emulator-darwin-x86_64-33.1.24.zip -d ~/Library/Android/sdk/emulator
-
运行测试:
bashemulator -avd Pixel_4_XL
-
结果还是报错:
bashINFO | Android emulator version 33.1.24.0 (build_id 11237101) (CL:N/A) dyld: Symbol not found: _vmnet_enable_isolation_key Referenced from: /Users/xxx/Library/Android/sdk/emulator/qemu/darwin-x86_64/qemu-system-x86_64 (which was built for Mac OS X 11.1) Expected in: /System/Library/Frameworks/vmnet.framework/Versions/A/vmnet zsh: abort emulator -avd Pixel_4_XL
-
看来 33.1.24 还是太新,依赖 macOS 11.1。
-
-
清除隔离属性(macOS 特有步骤)
macOS 有个安全机制,可能会标记下载的文件为"隔离",需要清除这个属性。我运行了:
bashxattr -dr com.apple.quarantine ~/Library/Android/sdk/emulator
这样可以减少启动时系统弹窗提示。
-
替换 package.xml 并修改版本号
-
从备份的
emulator_original
文件夹中复制package.xml
到新的emulator
目录:bashcp ~/Library/Android/sdk/emulator_original/package.xml ~/Library/Android/sdk/emulator/
-
打开
package.xml
,找到版本号部分,比如:xml<revision><major>31</major><minor>1</minor><micro>4</micro></revision>
-
修改成我下载的版本号(比如 33.1.24),保存文件。
-
-
再试更低版本:32.1.15
-
既然 33.1.24 不行,我又从存档页面下载了
32.1.15
,重复上面步骤解压并替换。 -
修改
package.xml
中的版本号为<major>32</major><minor>1</minor><micro>15</micro>
。 -
运行:
bashemulator -avd Pixel_4_XL
-
这次终于成功了!模拟器顺利启动,我跑了个简单 App 测试,完全没问题。
-
为什么这样能解决?
分析下来,最新版 Emulator 是为 macOS 12 或 11 设计的,依赖一些新系统符号(像 _vmnet_enable_isolation_key
),而 Catalina 10.15.7 的框架太老,压根不支持。降低到 32.1.15 后,Emulator 的依赖刚好跟我的系统匹配上了。
小建议:调试和优化
-
加日志查问题 :如果还不确定问题出在哪,可以加
-verbose
参数:bashemulator -avd Pixel_4_XL -verbose
这样能看到详细日志,方便定位。
-
试试软件渲染 :如果启动慢或不稳定,可以加个参数:
bashemulator -avd Pixel_4_XL -gpu swiftshader
写在最后
折腾了一圈,总算让模拟器在 macOS Catalina 上跑起来了。通过命令行启动和手动换版本的方法,我不仅解决了"Unknown Error",还对 Android 工具链多了几分了解。希望这篇经验分享能帮到跟我一样卡在兼容性问题里的朋友。如果你也试了这些步骤,欢迎在评论区聊聊你的结果,或者有啥更好的办法,咱们一起探讨!
题外话:欢迎关注我个人公众号"IT个人圈"。