Cordova安卓仿真 - 错误:无法读取null的'semver'属性。

40

尝试使用cordova模拟安卓应用,但是出现了以下错误信息:

构建以下apk文件: /Users/jnj/cordova/hello/platforms/android/build/outputs/apk/android-debug.apk ANDROID_HOME=/Users/jnj/Library/Android/sdk JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home

错误:无法读取null的'semver'属性

有什么解决办法吗?

6个回答

63

强大的Chris是正确的,那就是问题所在,并且他已经在上游修复了它(谢谢Chris!)。但是,对于像我这样无法更新cordova-android以包含补丁的人来说,解决方法是(适用于cordova-android v6.4.0):

  • 找到路径<project_root>/platforms/android/cordova/lib/emulator.js
  • 找到行avd.target = 'Android ' + level.semver + ' (API level ' + api_level + ')';
  • 将其替换为avd.target = 'Android ' + (level ? level.semver : '') + ' (API level ' + api_level + ')';

这里是相关的补丁


谢谢,有什么办法可以为此创建一个钩子或其他东西,以便平台重新应用修复吗? - Trevor
@themis 当然,基本上“level”被错误地认为总是被定义了,但事实并非如此,特别是当您使用尚未发布的Android版本时。这会导致整个脚本在尝试访问level.semver(Android版本)时崩溃,但由于此信息对于模拟器工作并不是必需的,所以代码(level?level.semver:'')就像:“嘿,‘level’被定义了吗?如果是,则获取其semver信息,否则不要紧,让它为空白”。 - oidualc
但是每次我添加Android项目时都必须这样做。 - themhz
@themis 是的,因为这只是一个解决办法,真正的修复已包含在 cordova android 的后续版本中。 - oidualc
2
似乎已经固定在android@~7.1.0版本。 - Vaiden
这里有一个链接,解释了如何安装最新版本及其修复程序:https://cordova.apache.org/announcements/2018/02/26/cordova-android-7.1.0.html - Nathan Prather

63

这是由于使用不稳定的开发者预览 API 版本的模拟器导致的。

你可能正在使用 API 27(Android 8.1)的设备。

打开 AVD,删除该设备并重新运行。

如果你有多个模拟器,启动模拟器时使用 --target <emulator_name> 是很有用的。

要获取可以使用的名称列表,请使用 --list 命令调用 emulate 命令。


1
我今天遇到了这个错误,通过移除我的8.1模拟器并安装一个8.0模拟器来解决它。上游的修复还没有生效吗? - Benjamin H
1
没错。Android Studio 3.1.2使用不稳定的API 27(Oreo)默认模拟器。删除此模拟器并使用稳定的模拟器(8.0或更低的API)可以解决问题。 - imelgrat
注意:我发现 --list 只能与 run 一起使用,即 cordova run --list - Luke

9

cordova-android的list_images方法存在一个bug,当它遇到系统中不在其列表中的android版本时,会崩溃:https://github.com/apache/cordova-android/pull/422

您可以在项目中的platforms/android/cordova/emulator.js中手动应用修复。


1

我曾经遇到过类似的问题,我的解决方法是在终端上运行adb devices来检查我的设备是否连接正常,结果发现我的设备没有正确连接,我认为是我的USB线出了问题,所以我断开了连接,重新连接并再次运行相同的命令adb devices,然后它显示我的设备已经连接。我的问题得到了解决,希望能帮助其他人。


0

对于我而言,在 Mac 上,要使模拟器中的 sdk 运行,需要执行以下步骤:

打开 Android Studio(如果启动时未打开您的项目,则打开它)

选择“工具 -> AVD 管理器”来打开设备管理器工具

右键单击相关图像(或者首先创建一个),然后选择“立即冷启动”,并等待模拟器启动

在终端中,进入到您的 platformsconfig.xml 文件所在的文件夹。这是可以运行 cordova 命令的位置

使用 adb devices 列出可用设备(如果提示未安装,请安装它)以获取正在运行的设备列表,并获取您的模拟器 ID。在本次操作中,我的模拟器 ID 是 emulator-5554

运行命令 cordova run android --target "emulator-5554",将 emulator-5554 替换为您自己的参考。


0

我之前一直认为"emulation"命令会启动模拟器,但实际上它只是使用已经在运行的模拟器。一些在安装Android Studio和Cordova之后可用于Windows 10的有用命令和检查:

  1. cordova run --list 命令将不会显示任何设备并且会出现 semver 错误。
  2. adb devices -l 命令应该不会显示任何已连接的设备。
  3. 确保你的 PATH 环境变量包含以下路径:%ANDROID_SDK_ROOT%\emulator%ANDROID_SDK_ROOT%\platform-tools%ANDROID_SDK_ROOT%\tools
  4. Emulator command line
    • 运行 emulator -list-avds 命令查看可用的模拟器。如果没有,则通过 Android Studio 添加。
    • 打开另一个命令行窗口,输入 start cmd
    • 启动模拟器 - 例如: emulator -avd 7_WSVGA_Tablet_API_30 (注意名称中的空格用下划线代替)
  5. adb devices -l 命令现在应该会显示一个名为 "emulator-5554" 的设备。
  6. cordova run --list 命令仍然会出现 semver 错误。(也许这是一个 bug?)
  7. cordova run android 命令(从你的应用程序项目目录中)将使用默认的模拟器启动你的应用程序,或者你可以使用 cordova run android --target emulator-5554 命令指定一个模拟器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接