Broken AVD System Path - AVD Manager无法运行安卓模拟器

最近我自己碰到一个问题,安卓模拟器启动不了,尝试启动时有个非常清楚的报错:PANIC: Broken AVD system path. Check your ANDROID_SDK_ROOT value[C:\Program Files (x86)\Android\android-sdk]!

截图如下:

我做了什么引起的问题

由于我有一段时间没有更新VS以及安卓模拟器了,在这个问题发生之前,我的安卓模拟器还是基于安卓API Level 25的系统创建出来的。

由于现在市面上大部分的手机都是基于安卓8.0以上的版本了,所以我想通过升级一下模拟器来做一些项目的测试工作。

但是当我从AVD Manager里面修改当前模拟器的一些属性来升级之后,这个问题就发生了。

解决方案

其实这个问题的解决方案非常简单,当然,这样说仅限于我的问题,其他人可能会碰到其他的原因导致的这个报错,我暂时不知道还有没有其他的可能性。

我唯一需要做的就是,将电脑环境变量中的ANDROID_SDK_ROOT以及ANDROID_HOME设置相同的值就可以了。

在我的环境下,我将两个环境变量都设置为了C:\Program Files (x86)\Android\android-sdk,这个路径是安装VS的时候会默认帮我们安装安卓SDK的路径。

那么为什么会发生这个问题,为什么两个路径需要一致,请看下一个片段。

问题分析

这个问题上我确实花了比较长的时间,主要原因是网上搜索出来的资料并不能真正帮到我。

我自己尝试了一下步骤:

  1. 我检查了安卓SDK的路径并确保该路径C:\Program Files (x86)\Android\android-sdk下的所有目录也都是正确的。
  2. 我检查了环境变量ANDROID_SDK_ROOT,因为错误代码中提示是这个路径,发现确实有这个环境变量并且数值是这个。
  3. 我也检查了AVD的路径:C:\Users\{UserName}\.android\avd,发现模拟器的镜像确实存在。

之后我发现一篇文档:PANIC: Broken AVD system path. Check your ANDROID_SDK_ROOT value

但是当我看它的标准答案的时候,我尝试了他的步骤(上面也提到过),但是并没有帮助到我解决问题。

最终是如下的一段话提示到了我:

它是这么说的:

In my case it was broken because ANDROID_HOME and ANDROID_SDK_ROOT were different, so once I set ANDROID_HOME to be the same as ANDROID_SDK_ROOT then it started working.

之后我突然想明白了这个问题的根本原因。

实际上这个问题的发生是因为我的电脑上其实有两套安卓SDK。这是为什么呢?因为我同时安装了VS和Android Studio。

在安装VS2017的时候,它会自动帮我们把安卓SDK安装在路径:C:\Program Files (x86)\Android\android-sdk。但是装Android Studio的时候,它却会帮我们把安卓SDK的路径默认安装在:C:\Users\{UserName}\AppData\Local\Android\sdk,这也是我这个问题发生时候ANDROID_HOME的环境变量的值。

为什么之前的模拟器可以正常运行?

这就是这个问题最tricky的部分。其实我们应该要问,为什么升级后的模拟器不能正常运行?

这是因为:在我的每一个安卓SDK的路径下,都会有一个system-images的文件夹,其中包含了模拟器需要运行的系统镜像。

在我的电脑上,原来的ANDROID_HOME路径下,只有2个system images,分别是android-25 以及 android-26,查看如下截图:

但是我升级的模拟器是基于API Level 27的,所以导致了这个问题。同时我们也可以知道,运行模拟器的时候其实它还是会去检查ANDROID_HOME下的路径,并不是只用到了ANDROID_SDK_PATH,因为我的ANDROID_SDK_PATH下是有API Level 27的镜像的。

这个问题给我的启发

在一开始的时候,我是认为按照这个默认安装方式有2套安卓SDK是更好的。原因是本身就是默认的安装路径,我通常都是支持默认的路径的。另外就是我想着如果一套安卓SDK的环境出现问题,那么只要简单地换一个路径就能使用新的安卓SDK了。

但是,经历了这个问题之后,我发现我之前错了。我能想到至少2个不好的地方,如果真的是维持2套安卓SDK的话:

  1. 假设你要保持两套安卓SDK的环境一模一样,比如你要同时安装安卓6.0,7.1和8.0的SDK,那你平白无故就会损失多一倍的物理磁盘空间,非常不划算。
  2. 如果你忘记了去保持两套安卓SDK的环境一致性,那么你就可能碰到像我今天这种奇怪的问题。

总而言之,最好的方式就是,只维护一套安卓SDK,当出现问题,想办法修复它甚至可以重新安装一个新的环境。

Xamarin.Android vs. Native Android - 如何在C#中实现Java的Listener Xamarin.Forms使用Azure Mobile Apps SDK的offline sync功能时的痛点介绍
You need to set install_url to use ShareThis. Please set it in _config.yml.

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×