Gradle构建失败:Dex文件不能超过64k

时间:2016-07-05 20:03:11

标签: java android gradle dalvik dex

每当我按项目构建并准备在我的设备上启动时,我都会收到此错误:

  

错误:.dex文件中的方法引用数不能超过64K。   了解如何在https://developer.android.com/tools/building/multidex.html

解决此问题

此外,我收到此错误:

  

错误:任务':app:transformClassesWithDexForDebug'的执行失败。   com.android.build.api.transform.TransformException:com.android.ide.common.process.ProcessException:java.util.concurrent.ExecutionException:com.android.ide.common.process.ProcessException:org.gradle.process。 internal.ExecException:进程'命令'C:\ Program Files \ Java \ jdk1.8.0_91 \ bin \ java.exe''以非零退出值2结束

它说gradle构建失败并出现两个错误

所以我有一些问题:

  • 什么是dex文件
  • 我没有直接使用它们,为什么我会得到上面的错误?
  • 什么是dex文件?
  • 这些文件对.APK文件大小有什么要说的吗?

在我停止使用proguard进行调试构建之后,这些错误再次出现,因为StackTrace没有显示,而且在我激活proguard之前我有错误。

之前我曾经遇到过这个错误,我删除了dex文件夹并解决了它,但现在它突然变得不够了。

我的gradle文件:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "com.example.myproject"
        minSdkVersion 15
        targetSdkVersion 23

    }

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true

            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

    }
}

dependencies {

    compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha1'
    compile 'com.android.support:support-v4:23.3.0'
    compile 'com.google.android.gms:play-services:9.2.0'
    compile 'com.google.android.gms:play-services-ads:9.2.0'
}

3 个答案:

答案 0 :(得分:4)

您添加的依赖项越多 - 您的方法计数就越高。更改您的gradle以反映这一点:

defaultConfig {
    ...
    minSdkVersion 15
    targetSdkVersion 23
    ...

    // Enabling multidex support.
    multiDexEnabled true
}

这是一个直接修复,只有在你的minSdkVerison为14或更高时才有效。 还要添加以下依赖项:

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

有时,你利用的依赖关系会(单独)引用相同的库 - 你可能有很多方法可以加倍,三倍,四倍等等......看看这个SO答案来解决这个问题并且总是减少你的APK大小。 gradle - library duplicates in dependencies

答案 1 :(得分:1)

来自Google文档:

  

Android应用程序(APK)文件包含可执行的字节码文件   Dalvik可执行文件(DEX)文件的形式,包含已编译的文件   用于运行您的应用的代码。 Dalvik可执行规范限制   单个DEX中可引用的方法总数   文件到65,536-包括Android框架方法,库方法,   和你自己的代码中的方法。

要解决此问题,您需要在代码中进行以下更改:

的build.gradle

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.0"

    defaultConfig {
        ...
        minSdkVersion 14
        targetSdkVersion 21
        ...

        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}

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

的AndroidManifest.xml

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

将这些配置设置添加到应用程序时,Android   构建工具构造一个主要的dex(classes.dex)和支持   (classes2.dex,classes3.dex)根据需要。然后构建系统   将它们打包成APK文件进行分发。

请注意:如果您的代码中已经有类从Application类扩展,那么只需将其更改为从MultidexApplication扩展。

答案 2 :(得分:0)

playservices lib非常庞大。即使是一个小应用程序也可能遇到这个问题。使用Proguard后,由于优化删除未使用的东西,问题将消失。对于开发(调试版本) - 仅将lib限制为您真正使用的内容通常会有所帮助。您可以尝试缩小库或/并在compile()gradle语句中使用'exclude'过滤器。

例如,当我需要它用于位置服务时,我使用了:

compile 'com.google.android.gms:play-services:10.2.0'

起初并得到了这条消息。用

替换它
compile 'com.google.android.gms:play-services-location:10.2.0'

并优雅地解决了问题。