多个 dex 文件定义 Lorg/apache/cordova/BuildHelper

Posted

技术标签:

【中文标题】多个 dex 文件定义 Lorg/apache/cordova/BuildHelper【英文标题】:Multiple dex files define Lorg/apache/cordova/BuildHelper 【发布时间】:2018-03-15 16:41:22 【问题描述】:

从昨天开始我就有麻烦了。在我的实习中,我遇到了以下构建错误,但我不明白为什么:

$ cordova build android

[...]

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexException: Multiple dex files define Lorg/apache/cordova/BuildHelper;

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 3.379 secs
Error: /home/thor/Projects/App_CDP/platforms/android/gradlew: Command failed with exit code 1 Error output:
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexException: Multiple dex files define Lorg/apache/cordova/BuildHelper;

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

这是cordova plugins list 的输出,我没有你看到的support-v4/v13 冲突:

$ cordova plugin list
com.googlemaps.ios 2.2.0-fixed "Google Maps SDK for iOS"
com.moust.cordova.videoplayer 1.0.1 "Video Player"
cordova-plugin-camera 2.4.1 "Camera"
cordova-plugin-compat 1.1.0 "Compat"
cordova-plugin-console 1.0.5 "Console"
cordova-plugin-device 1.1.4 "Device"
cordova-plugin-facebook4 1.9.1 "Facebook Connect"
cordova-plugin-file 4.0.0 "File"
cordova-plugin-file-transfer 1.6.3 "File Transfer"
cordova-plugin-geolocation 2.4.3 "Geolocation"
cordova-plugin-googlemaps 1.4.0 "phonegap-googlemaps-plugin"
cordova-plugin-inappbrowser 1.7.1 "InAppBrowser"
cordova-plugin-splashscreen 4.0.3 "Splashscreen"
cordova-plugin-statusbar 2.2.2 "StatusBar"
cordova-plugin-whitelist 1.3.1 "Whitelist"
ionic-plugin-keyboard 2.2.1 "Keyboard"

这里还有更多信息:

$ cordova -v
7.0.1

$ ionic -v
2.1.4

【问题讨论】:

试试这个***.com/questions/32511242/… 我已经尝试过这个修复,但它对我不起作用。 【参考方案1】:

您很可能正在使用新发布的cordova-android@6.3.0,它现在包括BuildHelper.java(如您的错误消息中所述)和PermissionHelper.java,但您的项目中仍然有已弃用的cordova-plugin-compat,这会导致构建失败,因为它also contains these classes。

要解决此问题,请从您的项目中删除 cordova-plugin-compat 以从 cordova-android 平台项目中卸载这些 Java 文件::

cordova plugin rm cordova-plugin-compat --force

更新

要保留此更改,请添加 cordova-plugin-compat@1.2,其中包括 engine constraint 以防止 Java 文件重新安装到 cordova-android@6.3+ 平台中:

cordova plugin add cordova-plugin-compat@1.2

另一个更新(从 cmets 复制粘贴)

删除和添加cordova-plugin-compat@1.2后,您只能从文件夹platforms/android中删除文件BuildHelper.java和PermissionHelper.java,而不是删除和添加整个Android平台

【讨论】:

嘿坦克它现在工作正常。但我不得不删除cordova-plugin-camera,我不知道它是否被我的新版本取代 如果您更愿意使用cordova-android@6.2.3,请确保项目文件夹中的package.jsonconfig.xml 使用"6.2.3" 而不是"^6.2.3",然后删除platforms/android 文件夹,重新运行cordova prepare androidcordova build android 应该没有错误。 应该担心警告:The plugin 'cordova-plugin-compat' is required by (cordova-plugin-geolocation) but forcing removal? 当我强制卸载 compat 时,我还想知道一些其他插件需要 compat 的警告。你怎么能毫无问题地做到这一点,因为据我所知,这只是版本 1.1.0 的问题。一旦您强制卸载它并再次安装插件,您将获得 1.2 版,它不再导致问题。 删除和添加cordova-plugin-compat@1.2后,您只能从文件夹platforms/android/src/org/中删除文件BuildHelper.java和PermissionHelper.java,而不是删除和添加整个Android平台阿帕奇/科尔多瓦【参考方案2】:

要加我的 2 美分,因为没有一个解决方案适合我。 唯一对我有用的东西:

cordova plugin rm cordova-plugin-compat --force
cordova platform rm android
cordova platform add android@6.3.0

【讨论】:

谢谢,它有效。我花了好几个小时来解决这个问题,终于来到了这里。 谢谢。拯救了我的一天。【参考方案3】:

我必须这样做:

cordova plugin rm cordova-plugin-compat --force
cordova plugin add cordova-plugin-compat@1.2
cordova platform rm android
cordova platform add android@6.3.0

考虑到您不能简单地删除 cordova-plugin-compat,因为像 cordova-plugin-file 这样的插件依赖于它。

【讨论】:

它的 1.2 版本是为了向后兼容 - “这个插件不再工作,因为这个插件提供的功能现在包含在 cordova-android 6.3.0 中。你应该升级你的应用程序到使用这个插件的1.2.0版本,它会根据你的应用使用的cordova-android版本检测是否需要插件。" 感谢@AdamMaloney 的解释!【参考方案4】:

我知道问题已经回答了,但我想添加官方发布说明的链接:

https://cordova.apache.org/news/2017/11/10/plugins-release.html

在我们上一个插件版本中,我们弃用了 cordova-plugin-compat,因为它已集成到 cordova-android@6.3.0 中。因此,对于这个发布周期,我们已经从依赖它的插件中删除了依赖,并为插件提供了主要版本跳转。以下插件已删除 cordova-plugin-compat:cordova-plugin-camera、cordova-plugin-contacts、cordova-plugin-file、cordova-plugin-geolocation、cordova-plugin-media 和 cordova-plugin-media -捕获

因此,请确保将所有列出的插件更新为发布说明中发布的版本。

【讨论】:

这是最好的答案应该被标记为!亚历山大干杯!正如许多人建议的那样,我不得不降级到 6.3.0 感觉并不好 - 必须有更好的方法。 谢谢你,你拯救了我的一天【参考方案5】:

一种解决方案:降级cordova android platform @6.2.3

$cordova platform remove android && cordova platform add android@6.2.3

【讨论】:

【参考方案6】:

我的 Ionic 3 项目足以运行:

ionic cordova plugin rm cordova-plugin-compat --force
ionic cordova plugin add cordova-plugin-compat@1.2

然后再次运行构建。无需删除和添加平台。

【讨论】:

【参考方案7】:

我正在使用 Ionic 3 项目,我必须这样做:

ionic cordova plugin rm cordova-plugin-compat --force
ionic cordova plugin add cordova-plugin-compat@1.2
ionic cordova platform rm android
ionic cordova platform add android@6.3.0

这对我有用。

【讨论】:

【参考方案8】:

我有同样的错误,我的插件中没有兼容插件,我只是运行该代码,然后我构建,它工作正常

$ cordova platform remove android && cordova platform add android@6.2.3

【讨论】:

【参考方案9】:

强制删除插件cordova-plugin-compat android sdk 6.3.0 以上版本或同等版本,因为它与cordova android 集成。

cordova 插件 rm cordova-plugin-compat --force

作为下面的参考

https://cordova.apache.org/announcements/2017/09/27/android-release.html

【讨论】:

【参考方案10】:

cordova 插件 rm cordova-plugin-compat --force

cordova 平台 rm android

cordova平台添加android@6.3.0

cordova插件添加cordova-plugin-compat@1.2

按这个顺序,对我有用!!非常感谢

【讨论】:

【参考方案11】:

这是解决方案:

cordova plugin rm cordova-plugin-compat --force

【讨论】:

【参考方案12】:

我确认 DaveAlden 的回答有效!!

但是在cordova-plugin-compat 中的plugin.xml 中,我有一个小于符号'

这个问题出现在visual studio中,你不能用配置管理器安装插件,因为它在插件资源的xml中检测到这个语法错误。

你必须像 DaveAlden 所说的那样使用命令行安装。

忽略错误,安装后替换:

<engine name="cordova-android" version="<6.3.0"/>

通过

<engine name="cordova-android" version="&lt;6.3.0"/>

最后运行编译!! :)

【讨论】:

【参考方案13】:

在更新其他插件的依赖后,我已经删除了 Compat 插件;喜欢相机到新版本,它的工作。 例子: 科尔多瓦插件rm科尔多瓦插件相机--保存 cordova 插件添加 cordova-plugin-camera@latest --save 发布新插件添加旧版本 2.3.0 已替换为 4.0.2 用于相机插件。

在这一步之后。我只是删除了插件“Compat” cordova 插件 rm cordova-plugin-compat --force

【讨论】:

【参考方案14】:

在简历上。这意味着plugin-camera与最新版本的android oreo不兼容

【讨论】:

【参考方案15】:

我正在使用 Ionic 4,这为我解决了这个问题(只需几秒钟即可运行):

cordova clean

【讨论】:

【参考方案16】:

android 版本中的插件可能不匹配。所以最好运行 2 个命令以成功构建

cordova platform rm android
cordova platform add android

在浪费了 2 天之后,这对我来说似乎只是可行的解决方案。

【讨论】:

【参考方案17】:

以上解决方案都不适合我。对我来说,解决方案是升级 gradle。我使用的是 gradle 5.6.2。更新到 5.6.4 然后删除并添加我的 android 平台和插件就可以了。

brew upgrade gradle

Install / upgrade gradle on Mac OS X

rm -rf plugins/*

cordova platform rm android

cordova platform add android

【讨论】:

以上是关于多个 dex 文件定义 Lorg/apache/cordova/BuildHelper的主要内容,如果未能解决你的问题,请参考以下文章

无法执行dex:多个dex文件定义了Lcom/myapp/R$array;

无法执行dex:多个dex文件定义了Lorg/apache/cordova/App$1

多个 dex 文件定义 Lcom/google/firebase/FirebaseException

如何修复将字节码转换为 dex 的错误原因:com.android.dex.DexException:多个 dex 文件定义 Lorg/apache/http/conn/ssl/AbstractVer

多个dex文件定义Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat

多个 dex 文件定义 Lorg/apache/cordova/BuildHelper