尝试运行时在com.android.prefs.AndroidLocation.getAvdFolder()上获取NoSuchMethodError异常;爱奥尼亚cordova运行——仿真器;

尝试运行时在com.android.prefs.AndroidLocation.getAvdFolder()上获取NoSuchMethodError异常;爱奥尼亚cordova运行——仿真器;,android,cordova,ionic-framework,emulation,android-sdk-tools,Android,Cordova,Ionic Framework,Emulation,Android Sdk Tools,我刚刚升级了我的cordova和ionic(npm升级-g cordova-ionic),现在当我运行“ionic cordova run--emulator”时,我收到以下错误消息: 线程“main”java.lang.NoSuchMethodError中出现异常:com.android.prefs.AndroidLocation.getAvdFolder()Ljava/lang/String 构建成功了,它似乎不想启动模拟器 任何帮助都将不胜感激 以下是生成成功消息后日志的结尾: 建设成功

我刚刚升级了我的cordova和ionic(npm升级-g cordova-ionic),现在当我运行“ionic cordova run--emulator”时,我收到以下错误消息:

线程“main”java.lang.NoSuchMethodError中出现异常:com.android.prefs.AndroidLocation.getAvdFolder()Ljava/lang/String

构建成功了,它似乎不想启动模拟器

任何帮助都将不胜感激


以下是生成成功消息后日志的结尾:

建设成功

总时间:5.135秒 构建了以下apk: /Users/lesbuchanan/source/personal/sandbox/mobile/ionic/phone-vow/platforms/android/build/outputs/apk/android-debug.apk

ANDROID_HOME=/Users/lesbuchanan/Library/ANDROID/sdk/ JAVA_HOME=/Library/JAVA/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/HOME 错误:avdmanager:命令失败,退出代码为1错误输出: 线程“main”java.lang.NoSuchMethodError中出现异常:com.android.prefs.AndroidLocation.getAvdFolder()Ljava/lang/String; 位于com.android.sdklib.internal.avd.AvdManager.getInstance(AvdManager.java:380) 位于com.android.sdklib.tool.avdmanagerli.getAvdManager(avdmanagerli.java:338) 在com.android.sdklib.tool.avdmanagerci.displayAvdList(avdmanagerci.java:516) 在com.android.sdklib.tool.avdmanagerci.doAction(avdmanagerci.java:355) 在com.android.sdklib.tool.avdmanagerci.run(avdmanagerci.java:203)上 位于com.android.sdklib.tool.avdmanagerli.main(avdmanagerli.java:193)

[错误]Cordova遇到错误。 通过直接运行上面的Cordova命令,您可以获得更多信息


[错误]运行cordova run android--emulator时出错(退出代码1)。在此处输入代码

,事实证明,我只是使用android Studio更新SDK工具。转到首选项->外观和行为->系统设置->Android SDK,然后单击SDK工具选项卡。我更新了以下软件包:

  • Android SDK构建工具
  • Android仿真器
  • Android SDK平台工具
  • Android SDK工具
  • 英特尔x86仿真器加速器
  • 支持存储库->Android支持存储库
  • 支持存储库->谷歌存储库
老实说,我不确定哪个软件包解决了我的问题,但我认为同时更新所有软件包是个好主意。希望这能帮助别人。

tl;dr 您遇到了一个jar地狱问题,可能是由Android SDK补丁程序引起的。对我来说唯一有效的方法就是删除
ANDROID_HOME
目录中的所有内容,并使用IntelliJ IDEA的ANDROID SDK管理器(ANDROID Studio构建在其顶部)重新安装ANDROID SDK。请注意,更新
androidsdk工具
可能会起作用,因为它在中起作用,但它更像是一个幸运的解决方案,因为它往往是由SDK补丁程序本身引起的

详细解释: Ionic、Cordova等在Android SDK提供的基础上构建
cordova run——emulator
调用
avdmanager
,因为您首先需要一个Android虚拟设备进行仿真。因此,我直接运行了它,但仍然遇到了OP的问题,显然排除了可能的原因导致的
cordova
ionic

$ $ANDROID_HOME/tools/bin/avdmanager.bat
Exception in thread "main" java.lang.NoSuchMethodError: com.android.prefs.AndroidLocation.getAvdFolder()Ljava/lang/String;
        at com.android.sdklib.tool.AvdManagerCli.init(AvdManagerCli.java:278)
        at com.android.sdklib.tool.AvdManagerCli.run(AvdManagerCli.java:210)
        at com.android.sdklib.tool.AvdManagerCli.main(AvdManagerCli.java:200)
如果查看
和manager.bat
文件,您将看到在第68-69行附近调用AVDManagerli主类:

@rem Execute avdmanager
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %AVDMANAGER_OPTS%  -classpath "%CLASSPATH%" com.android.sdklib.tool.AvdManagerCli %CMD_LINE_ARGS%
上面的一行设置了
CLASSPATH
变量,其中包括以下条目:
APP\u HOME%\lib\common-26.0.0-dev.jar
。如果您查看它的内部,例如解压缩并打开
com.android.prefs.AndroidLocation
类,您会注意到
getAvdFolder
方法存在。那它为什么要抱怨它呢?当我在过去遇到类似的问题时,这通常意味着类路径中有2个或更多版本的此类和/或该类从错误且通常过时的jar文件加载

因此,我想看看这个类加载了哪个jar。回到第68-69行的
avdmanager.bat
,添加了
-verbose:class
标志,其中使用上面的
java
命令调用
avdmanager.bat
,并再次运行
avdmanager.bat
,这次显示了正在加载的类:

[Opened C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar]
[Loaded java.lang.Object from C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar]
[Loaded java.io.Serializable from C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar]
[Loaded java.lang.Comparable from C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar]
...
...
many
...
entries
...
ahead
...
[Loaded com.android.sdklib.util.CommandLineParser$Arg from file:/C:/Users/sburcea/AppData/Local/Android/Sdk/tools/lib/sdklib-26.0.0-dev.jar]
[Loaded com.android.prefs.AndroidLocation from file:/C:/Users/sburcea/AppData/Local/Android/Sdk/tools/lib/common.jar]
Exception in thread "main" [Loaded java.lang.Throwable$PrintStreamOrWriter from C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar]
[Loaded java.lang.Throwable$WrappedPrintStream from C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar]
[Loaded java.util.IdentityHashMap from C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar]
[Loaded java.util.IdentityHashMap$KeySet from C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar]
java.lang.NoSuchMethodError: com.android.prefs.AndroidLocation.getAvdFolder()Ljava/lang/String;
        at com.android.sdklib.tool.AvdManagerCli.init(AvdManagerCli.java:278)
        at com.android.sdklib.tool.AvdManagerCli.run(AvdManagerCli.java:210)
        at com.android.sdklib.tool.AvdManagerCli.main(AvdManagerCli.java:200)
哈哈!所以
com.android.prefs.AndroidLocation
是从
android\u HOME/tools/lib/common.jar
加载的,在类路径中甚至没有提到它!查看
ANDROID\u HOME\lib\common.jar
发现它包含
com.ANDROID.prefs.AndroidLocation
类,但没有
\getAvdFolder
。这可能是我在我的机器上安装的旧SDK遗留下来的。我需要一个清理无论如何,并删除了文件夹,重新安装了Android SDK和问题消失了。我仍然想知道哪个jar加载了
com.android.prefs.AndroidLocation
类,我已经在我的
avdmanager.bat
中添加了
-verbose:class

$ /c/Users/sburcea/AppData/Local/Android/Sdk/tools/bin/avdmanager.bat | grep AndroidLocation
[Loaded com.android.prefs.AndroidLocation$AndroidLocationException from file:/C:/Users/sburcea/AppData/Local/Android/Sdk/tools/lib/common-26.0.0-dev.jar]
[Loaded com.android.prefs.AndroidLocation from file:/C:/Users/sburcea/AppData/Local/Android/Sdk/tools/lib/common-26.0.0-dev.jar]
[Loaded com.android.prefs.AndroidLocation$Global from file:/C:/Users/sburcea/AppData/Local/Android/Sdk/tools/lib/common-26.0.0-dev.jar]

肯定是安卓SDK工具,详细解释请参见我的答案。