簡體   English   中英

嘗試運行“ionic cordova run --emulator”時,在 com.android.prefs.AndroidLocation.getAvdFolder() 上出現 NoSuchMethodError 異常

[英]Getting NoSuchMethodError exception on com.android.prefs.AndroidLocation.getAvdFolder() when trying to run “ionic cordova run --emulator”

我剛剛升級了我的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=/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.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 命令獲得更多信息。

[錯誤] 運行cordova run android --emulator 時發生錯誤(退出代碼1)。在此處輸入代碼

事實證明,我只是使用 Android Studio 來更新 SDK 工具。 轉到首選項 -> 外觀和行為 -> 系統設置 -> Android SDK,然后單擊 SDK 工具選項卡。 我更新了以下軟件包:

  • Android SDK 構建工具
  • 安卓模擬器
  • Android SDK 平台工具
  • Android SDK 工具
  • 英特爾 x86 仿真器加速器
  • 支持庫->Android 支持庫
  • 支持倉庫->谷歌倉庫

老實說,我不確定哪個軟件包解決了我的問題,但我認為同時更新所有軟件包是個好主意。 希望這可以幫助某人。

tl;dr您遇到了 jar 地獄問題,可能是由 Android SDK 修補程序引起的。 唯一對我有用的是刪除ANDROID_HOME目錄中的所有內容並使用 IntelliJ IDEA 的 Android SDK 管理器(Android Studio 構建在其之上)並重新安裝 Android SDK。 請注意,更新Android SDK tools可能會起作用,因為它在Les Buchanan 的回答中起作用,但對於通常是由 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。 回到avdmanager.bat第 68-69 行,添加-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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM