无法构建apk:方法引用数量不能超过64K。

30

我一直在尝试为我的应用程序构建apk文件,但是遇到了错误:“方法引用的数量不能超过64K。”

以下是错误信息:

错误:.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.7.0_15\bin\java.exe'”以非零退出值2结束

这是我的Gradle文件:

apply plugin: 'com.android.application'

android {
compileSdkVersion 23
buildToolsVersion "23.0.3"

defaultConfig {
    applicationId "nikhilraghavendra.hopper"
    minSdkVersion 21
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
        shrinkResources true
        minifyEnabled true
        useProguard true
        proguardFiles getDefaultProguardFile('proguard-android.txt'),
                'proguard-rules.pro'
    }
}
packagingOptions {
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/LICENSE-FIREBASE.txt'
    exclude 'META-INF/NOTICE'
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.2.1'
compile 'com.android.support:design:23.2.1'
compile 'com.google.android.gms:play-services-identity:8.4.0'
compile 'com.firebase:firebase-client-android:2.3.1'
compile 'com.android.support:cardview-v7:23.2.1'
compile 'com.google.android.gms:play-services:8.4.0'
}

我想要构建apk文件并且无误地部署它,该怎么办?

更新

我也尝试了以下方法

apply plugin: 'com.android.application'

android {
compileSdkVersion 23
buildToolsVersion "23.0.3"

dexOptions {
    maxProcessCount = 4 // this is the default value
}

dataBinding{
    enabled = true
}

defaultConfig {
    applicationId "nikhilraghavendra.hopper"
    minSdkVersion 21
    targetSdkVersion 23
    resConfigs "en", "fr"
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
        shrinkResources true
        minifyEnabled true
        useProguard true
        proguardFiles getDefaultProguardFile('proguard-android.txt'),
                'proguard-rules.pro'
    }
    debug {
        minifyEnabled true
        useProguard false
    }
}
packagingOptions {
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/LICENSE-FIREBASE.txt'
    exclude 'META-INF/NOTICE'
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.2.1'
compile 'com.android.support:design:23.2.1'
compile 'com.google.android.gms:play-services-identity:8.4.0'
compile 'com.firebase:firebase-client-android:2.3.1'
compile 'com.android.support:cardview-v7:23.2.1'
compile 'com.google.android.gms:play-services:8.4.0'
}

这导致出现以下错误信息:

Error:Execution failed for task ':app:transformClassesWithNewClassShrinkerForDebug'。

缩小期间发现警告,请使用-dontwarn或-ignorewarnings来抑制它们。

我该如何处理并构建正确的apk?请帮帮我。


http://developer.android.com/tools/building/multidex.html - camelCaseCoder
你需要启用Multidex,请按照上面的链接进行操作。 - Azahar
3个回答

72
android {
    compileSdkVersion 26
    buildToolsVersion "26.0.0"

    defaultConfig {
        applicationId "com.try.app"
        minSdkVersion 21
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }

在这里,multiDexEnabled true应该对你有帮助。

更新:支持最新的Android版本
1. 如果你的minSdkVersion设置为21或更高,则只需在模块级别的build.gradle文件中将multiDexEnabled设置为true,如上所示。
2. 然而,如果你的minSdkVersion设置为20或更低,则必须使用multidex支持库以及上述更改,具体操作如下:

dependencies {
  compile 'com.android.support:multidex:1.0.1'
}
除了上述支持库的添加外,您还需要根据 链接中提到的更改您的应用程序类。
最佳实践: 1. 使用proguard删除任何未使用的代码。 2. 避免在项目中添加不必要的依赖项。 3. 如果需要任何开源库的有限数量的方法或类,则建议仅在您的项目中克隆它们,因为这不仅使您对它们具有完全控制权,而且还允许proguard对它们进行操作,并且您的代码中没有任何未使用的方法。
来源:Android Developers - Configure Apps with 64K Method count

只有这些吗?那其他在这里描述的内容呢?https://developer.android.com/studio/build/multidex.html - Andrew S
嗨@AndrewS,感谢您指出这个问题。这个答案已经有一段时间没有更新了,我会尽快更新它。谢谢。 - Mohammed Atif
你什么时候会更新你的答案?我们都在等待着你的更新。 - user3600801
@HaraHaraMahadevaki 这个答案适用于基本项目。请尝试一下。 - Mohammed Atif

31

无法构建apk:当应用程序.dex文件具有超过65,536个方法时,方法引用的数量不能超过64K。

超过65K方法意味着方法计数超过65,536种。有不同的方法来解决它:

1. 减少项目中的依赖关系 将所需的依赖项放入gradle中

我发现其他开发人员遇到的大多数问题都是在项目中使用 Google Play 服务。

 compile 'com.google.android.gms:play‐services:8.4.0'

因此,最好的方法是仅选择您真正想要使用的 Google Play 服务依赖项。

compile 'com.google.android.gms:play‐services‐location:8.4.0'
compile 'com.google.android.gms:play‐services‐maps:8.4.0'
compile 'com.google.android.gms:play‐services‐ads:8.4.0'

2. 将最低SDK版本设置为21或更高

为什么将最低SDK版本更改为21后就可以工作了呢?因为Android 5.0或更高版本使用的是支持MultiDex的ART(Android Runtime),而不是Dalvik。因此,ART可以支持超过65,536个方法。

3. 使用Proguard来减少无用的方法

4. 使用MultiDex

但这些是MultiDex库的限制:

• 如果.dex文件太大,则在应用启动时可能会出现ANR。

• 应该将最低SDK版本定义为14或更高。

• MultiDex使用更多的内存,并且如果分配的内存超过限制,则可能在应用运行时崩溃。

• 在构建项目时需要更多的时间。


不要随意更改你的谷歌服务依赖,根据这个解释。如果你的系统正常工作,我的Gradle现在出了问题。 - Samir
点赞。这些多dex的数学计算有什么用?还有一些缩小操作。https://developers.google.com/android/guides/setup 这里有一个拆分服务的列表。只需选择要使用的即可。 - CodeToLife

6

将以下代码放入defaultConfig中:

multiDexEnabled true

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接