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

时间:2016-06-21 12:39:07

标签: java cordova

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

  

:compileDebugNdk UP-TO-DATE:compileDebugSources

     

: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.ExecException:

     

进程'命令   ' C:\ Program Files \ Java \ jdk1.8.0_73 \ bin \ java.exe''完成了   非零退出值2

     

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

我刚刚在Android SDK中更新了所有必要的工具和库,然后我删除并重新添加了Android平台(cordova platform add android),确保检查所有相关平台文件都已消失,并且该项目仍未建成。

编辑:我也跑了cordova clean,但那不起作用。看起来Google Play服务库导致我的应用程序达到64,000方法限制,但除了手动调整我的gradle文件(我还没有用它)之外,我不确定我是怎么做的可以缩小

编辑2:我尝试调整build.gradle文件以删除对" com.google.android.gms的引用:play-services:+" (我认为将我的应用程序推到65535方法限制之上)但它只是不断回来。

我还尝试了一个build-extras.gradle来删除依赖项,但是又出现了另一个错误。理想情况下,我想要一个每次我想构建我的应用程序时都不需要不断重新工作的答案,但在这个阶段我几乎都热衷于此。

我最近升级了cordova,离子和bower(使用npm install -g cordova ionic bower后,在Windows上使用我的%PATH%变量搞砸了,但我不会想象会破坏任何东西。

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

  

java版本" 1.8.0_73"

     

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

     

Java HotSpot(TM)64位服务器VM(内置25.73-b02,混合模式)

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

  

:transformClassesWithDexForDebug意外的顶级例外:

     

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

此消息听起来像您的项目太大。

你有太多的方法。 dex只能有65536种方法。

由于gradle plugin 0.14.0Build Tools 21.1.0您可以使用multidex支持。

只需在build.gradle

中添加这些行
android {
    defaultConfig {
        ...
        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}

dependencies {
  compile 'com.android.support:multidex:1.0.0'
}

同样在您的Manifest中,将Multidex支持库中的MultiDexApplication类添加到应用程序元素

<?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>

如果您使用自己的Application类,请将父类从Application更改为MultiDexApplication。

@Override
  protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
  }

对于Google Play服务:

Google Play services and DEX method limits

资源链接:

Configuring Your App for Multidex with Gradle

优化Multidex开发构建

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

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

以下构建配置示例演示了如何在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'
}

资源链接:

  1. DexIndexOverflowException issue after updating to latest appcompat and support library
  2. Unable to execute dex: method ID not in [0, 0xffff]: 65536

答案 1 :(得分:3)

不建议直接修改build.gradle,因为在构建android平台后将会覆盖更改。 build.gradle的任何扩展都应该通过添加其他文件来完成,例如&#39; build-extras.gradle&#39;正如official documentation中所建议的那样。正如Grayda所建议的那样,更清洁的解决方案是使用插件来完成像魅力一样的工作。

遇到另外一个cordova multiplex plugin来完成这项工作并且哪些是有效的。您可以使用以下命令安装插件:

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

发布答案,因为它可能会使某人受益。

答案 2 :(得分:2)

除了@ SkyWalker的回答,我发现了一个Cordova multidex plugin很多&#34;更清洁&#34; (即,不对您的build.gradle文件进行手动修改。)

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