【问题标题】:Getting NoSuchMethodError exception on com.android.prefs.AndroidLocation.getAvdFolder() when trying to run "ionic cordova run --emulator"尝试运行“ionic cordova run --emulator”时在 com.android.prefs.AndroidLocation.getAvdFolder() 上出现 NoSuchMethodError 异常
【发布时间】:2017-10-12 10:48:02
【问题描述】:

我刚刚升级了我的 cordova 和 ionic (npm upgrade -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=/库/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home 错误:avdmanager:命令失败,退出代码 1 错误输出: 线程“主”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.AvdManagerCli.getAvdManager(AvdManagerCli.java:338) 在 com.android.sdklib.tool.AvdManagerCli.displayAvdList(AvdManagerCli.java:516) 在 com.android.sdklib.tool.AvdManagerCli.doAction(AvdManagerCli.java:355) 在 com.android.sdklib.tool.AvdManagerCli.run(AvdManagerCli.java:203) 在 com.android.sdklib.tool.AvdManagerCli.main(AvdManagerCli.java:193)

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

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

【问题讨论】:

    标签: android cordova ionic-framework emulation android-sdk-tools


    【解决方案1】:

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

    • Android SDK 构建工具
    • Android 模拟器
    • Android SDK 平台工具
    • Android SDK 工具
    • 英特尔 x86 仿真器加速器
    • 支持库->Android 支持库
    • 支持存储库->Google 存储库

    老实说,我不确定哪个软件包解决了我的问题,但我想同时更新所有软件包是个好主意。希望这对某人有所帮助。

    【讨论】:

    • 肯定是Android SDK Tools,详细解释见我的回答。
    【解决方案2】:

    tl;博士 您遇到了一个 jar hell 问题,可能是由 Android SDK 修补程序引起的。唯一对我有用的是删除 ANDROID_HOME 目录中的所有内容并使用 IntelliJ IDEA 的 Android SDK 管理器(Android Studio 构建在上面)并重新安装 Android SDK。请注意,更新 Android SDK tools 可能有效,因为它在 Les Buchanan's answer 中有效,但对于通常由 SDK 修补程序本身引起的某些问题来说,这更像是一个幸运的修复。

    详细说明: Ionic、Cordova 等建立在 Android SDK 提供的之上。 cordova run --emulator 调用 avdmanager 因为您首先需要一个 Android 虚拟设备来模拟。所以我直接运行它仍然遇到了OP的问题,显然从可能的原因中消除了cordovaionic

    $ $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)
    

    如果您查看andmanager.bat 文件,您会看到它在第 68-69 行附近调用了 AvdManagerCli 主类:

    @rem Execute avdmanager
    "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %AVDMANAGER_OPTS%  -classpath "%CLASSPATH%" com.android.sdklib.tool.AvdManagerCli %CMD_LINE_ARGS%
    

    它上面的一行设置了CLASSPATH 变量,其中包括以下条目:APP_HOME%\lib\common-26.0.0-dev.jar。如果你看里面,例如解压并打开com.android.prefs.AndroidLocation 类,你会注意到getAvdFolder 方法存在。那为什么avdmanager在抱怨呢?当我过去遇到类似问题时,这通常意味着类路径中有 2 个或更多版本的此类和/或从不正确且经常过期的 jar 文件中加载了该类。

    因此,我想看看为这个类加载了哪个 jar。回到第 68-69 行的avdmanager.bat,添加-verbose:class 标志,其中AvdManagerCli 使用上面的java 命令调用,然后再次运行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_HOME/tools/lib/common.jar 加载的,甚至在类路径中都没有提到!查看ANDROID_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]
    

    【讨论】:

      猜你喜欢
      • 2021-07-22
      • 1970-01-01
      • 2018-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 2016-05-19
      相关资源
      最近更新 更多