【问题标题】:Gradle build failed: Dex files cannot exceed 64k [duplicate]Gradle 构建失败:Dex 文件不能超过 64k [重复]
【发布时间】:2016-07-05 20:03:11
【问题描述】:

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

错误:.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: Process 'command 'C:\Program Files\Java\jdk1.8.0_91\bin\java.exe'' 以非零退出值 2 结束

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

所以我有一些问题:

  • 什么是 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'
}

【问题讨论】:

标签: java android gradle dalvik dex


【解决方案1】:

您添加的依赖项越多 - 您的方法计数就越高。更改您的 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

【讨论】:

  • 它会影响 APK 的大小吗?
  • 完整阅读错误信息中的文章——这一切都非常有见地!不过要回答这个评论:developer.android.com/studio/build/multidex.html#dev-build
  • FWIW,你可以永远在你的应用中拥有来自同一个库的多个依赖项——它们总是被 Gradle 删除。
【解决方案2】:

来自 Google 文档:

Android 应用程序 (APK) 文件包含可执行字节码文件 Dalvik Executable (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 扩展即可。

【讨论】:

    【解决方案3】:

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

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

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

    起初并收到该消息。将其替换为

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

    并优雅地解决了它。

    【讨论】:

      猜你喜欢
      • 2014-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多