Java cordova运行android失败,com.android.dex.DexIndexOverflowException:方法ID不在[0,0xffff]:65536中

Java cordova运行android失败,com.android.dex.DexIndexOverflowException:方法ID不在[0,0xffff]:65536中,java,cordova,Java,Cordova,在过去的几天里,我一直无法运行cordova run android(或者更确切地说,ionic run android)在我的本地设备上测试我的ionic应用程序。当我运行该命令时,我得到了通常的公吨输出,以及几个Java运行时进程100%的CPU使用率,然后构建最终失败,标题中说明了这一点。控制台显示了这一点(被截断,因为有大量的输出): :compiledBugndk最新:compiledBugSources :transformClassesWithDexForDebug意外的顶级异常:

在过去的几天里,我一直无法运行
cordova run android
(或者更确切地说,
ionic run android
)在我的本地设备上测试我的ionic应用程序。当我运行该命令时,我得到了通常的公吨输出,以及几个Java运行时进程100%的CPU使用率,然后构建最终失败,标题中说明了这一点。控制台显示了这一点(被截断,因为有大量的输出):

:compiledBugndk最新:compiledBugSources

:transformClassesWithDexForDebug意外的顶级异常:

com.android.dex.DexIndexOverflowException:方法ID不在[0]中, 0xffff]:65536

at com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:484)
at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:261)
at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:473)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:161)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)  FAILED
构建失败

总时间:1分钟40.116秒

    at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:504)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)
    at com.android.dx.command.dexer.Main.run(Main.java:277)
    at com.android.dx.command.dexer.Main.main(Main.java:245)
    at com.android.dx.command.Main.main(Main.java:106)
失败:生成失败,出现异常

错误:任务:transformClassesWithDexForDebug的执行失败

com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.exeception:

进程命令 “C:\Program Files\Java\jdk1.8.0\u 73\bin\Java.exe”已完成 非零出口值2

尝试:使用--stacktrace选项运行以获取堆栈跟踪。使用--info或--debug选项运行以获得更多日志输出。错误:带有args的命令cmd的错误代码1: /s、 /c,“E:\Documents\GitHub\app.auroras.live\platforms\android\gradlew cdvBuildDebug-b E:\Documents\GitHub\app.auroras.live\platforms\android\build.gradle -PcdvBuildArch=arm-Dorg.gradle.daemon=true-Pandroid.UseDeprecatedNDDK=true”

我只是去更新了Android SDK中任何必要的工具和库,然后删除并重新添加了Android平台(
cordova platform add Android
),确保检查所有相关的平台文件都已删除,并且项目仍然无法构建

编辑:我还运行了
cordova clean
,但这不起作用。看起来Google Play服务库让我的应用程序达到了64000个方法的限制,但除了手动调整我的gradle文件(我还不太熟悉),我不确定如何缩小它

编辑2:我试图调整build.gradle文件以删除对“com.google.android.gms:play services:+”的引用(我认为这将我的应用程序推高到65535方法限制之上),但它总是回来

我还尝试了一个build-extras.gradle来删除依赖项,但又出现了一个错误。理想情况下,我希望得到一个答案,而不是每次我想构建我的应用程序时都需要不断地重新工作,但在这个阶段,我渴望得到几乎任何东西

我最近确实升级了cordova、ionic和bower(使用
npm安装-g cordova ionic bower
),因为Windows上我的%PATH%变量出现了问题,但我不认为这会破坏任何东西

我正在运行Windows 10,x64。
java-version
报告:

java版本“1.8.0_73”

Java(TM)SE运行时环境(build 1.8.0_73-b02)

Java HotSpot(TM)64位服务器虚拟机(构建25.73-b02,混合模式)

有什么建议吗

:transformClassesWithDexForDebug意外的顶级异常:

com.android.dex.DexIndexOverflowException:方法ID不在[0]中, 0xffff]:65536

at com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:484)
at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:261)
at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:473)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:161)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)  FAILED
此消息听起来好像您的项目太大了

您的方法太多。dex只能有65536个方法

由于
gradle插件0.14.0
buildtools 21.1.0
可以使用
multidex
支持

只需将这些行添加到
build.gradle

android {
    defaultConfig {
        ...
        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}

dependencies {
  compile 'com.android.support:multidex:1.0.0'
}
另外,在清单中,将multidex支持库中的MultiDexApplication类添加到application元素

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.multidex.myapplication">
    <application
        ...
        android:name="android.support.multidex.MultiDexApplication">
        ...
    </application>
</manifest>
对于google play服务:

资源链接:

优化多索引开发构建 作为multidex开发过程的一部分执行的例行构建通常需要更长的时间,并且可能会减慢您的开发过程

为了减少multidex输出通常较长的构建时间,您应该使用Android插件为开发风格和生产风格在构建输出上创建两个变体

以下构建配置示例演示了如何在Gradle构建文件中设置这些风格:

android {
    productFlavors {
        // Define separate dev and prod product flavors.
        dev {
            // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin
            // to pre-dex each module and produce an APK that can be tested on
            // Android Lollipop without time consuming dex merging processes.
            minSdkVersion 21
        }
        prod {
            // The actual minSdkVersion for the application.
            minSdkVersion 14
        }
    }
          ...
    buildTypes {
        release {
            runProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                                                 'proguard-rules.pro'
        }
    }
}
dependencies {
  compile 'com.android.support:multidex:1.0.0'
}
资源链接:

  • 除了@SkyWalker的答案之外,我还发现了一个更“干净”的方法(也就是说,不需要手动修改
    build.gradle
    文件)


    只需使用
    cordova插件add--save安装即可https://github.com/jwall149/cordova-multidex
    在下一次构建时,将启用multidex,这将解决此问题。

    不建议直接修改
    build.gradle,因为在构建android平台后,更改将被覆盖。要构建的任何扩展.gradle应该按照中的建议添加额外的文件,如“build extras.gradle”。正如Grayda所建议的,更干净的解决方案是使用插件,它可以像charm一样完成任务

    又遇到一个执行此任务且处于活动状态的插件。您可以使用以下命令安装该插件:

    cordova plugin add https://github.com/solent/cordova-plugin-multidex
    

    发布答案,因为它可能会让其他人受益。

    我终于能够让我的应用程序生成了,谢谢你。我所需要做的就是将你的第一批代码添加到我的Cordova Platform文件夹中的build-extras.gradle文件中,并正确加载。看起来还有一个支持multidex的工具,所以这可能是一个更干净的解决方案对我来说。但是再次感谢!@Grayda非常欢迎你,感谢你的分享。奖励你+50奖金。虽然你的答案不是完全面向Cordova的,但这是一个很好的解释,也是一个很好的起点,可以通过builds-extra.gradle文件/我根据你的答案找到的multidex插件来修复它。再次感谢:)