Gradle 构建失败:Dex 文件不能超过 64k
Gradle build failed: Dex files cannot exceed 64k
每当我按项目构建并准备在我的设备上启动时,我总是收到此错误:
Error:The number of method references in a .dex file cannot exceed 64K.
Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html
此外,我收到此错误:
Error:Execution failed for task ':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'' finished with non-zero exit value 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'
}
您添加的依赖项越多 - 您的方法数就越多。更改您的 gradle 以反映这一点:
defaultConfig {
...
minSdkVersion 15
targetSdkVersion 23
...
// Enabling multidex support.
multiDexEnabled true
}
这是一个直接的修复方法,仅当您的 minSdkVerison 为 14 或更高版本时才有效。
同时添加如下依赖:
dependencies {
compile 'com.android.support:multidex:1.0.0'
}
有时,您利用的依赖项将(单独)引用相同的库 - 您可能有许多方法,这些方法是双倍的、三倍的、四倍的,等等...查看这个 SO answer 来解决这个问题并始终减少你的APK 大小。
来自 Google 文档:
Android application (APK) files contain executable bytecode files in
the form of Dalvik Executable (DEX) files, which contain the compiled
code used to run your app. The Dalvik Executable specification limits
the total number of methods that can be referenced within a single DEX
file to 65,536—including Android framework methods, library methods,
and methods in your own code.
要解决此问题,您需要对代码进行以下更改:
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>
When these configuration settings are added to an app, the Android
build tools construct a primary dex (classes.dex) and supporting
(classes2.dex, classes3.dex) as needed. The build system will then
package them into an APK file for distribution.
请注意: 如果您的代码中已经有 class 从应用程序 class 扩展,那么只需将其更改为从 MultidexApplication 扩展。
playservices 库非常庞大。即使是一个很小的应用程序也可能会遇到这个问题。使用 Proguard 后,由于优化删除了未使用的内容,问题将消失。对于开发(调试构建)——将库限制为您真正使用的库通常会有所帮助。您可以尝试缩小库 or/and 在 compile() gradle 语句中使用 'exclude' 过滤器。
例如,当我需要定位服务时,我使用了:
compile 'com.google.android.gms:play-services:10.2.0'
起初收到了那条消息。将其替换为
compile 'com.google.android.gms:play-services-location:10.2.0'
并顺利解决。
每当我按项目构建并准备在我的设备上启动时,我总是收到此错误:
Error:The number of method references in a .dex file cannot exceed 64K. Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html
此外,我收到此错误:
Error:Execution failed for task ':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'' finished with non-zero exit value 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'
}
您添加的依赖项越多 - 您的方法数就越多。更改您的 gradle 以反映这一点:
defaultConfig {
...
minSdkVersion 15
targetSdkVersion 23
...
// Enabling multidex support.
multiDexEnabled true
}
这是一个直接的修复方法,仅当您的 minSdkVerison 为 14 或更高版本时才有效。 同时添加如下依赖:
dependencies {
compile 'com.android.support:multidex:1.0.0'
}
有时,您利用的依赖项将(单独)引用相同的库 - 您可能有许多方法,这些方法是双倍的、三倍的、四倍的,等等...查看这个 SO answer 来解决这个问题并始终减少你的APK 大小。
来自 Google 文档:
Android application (APK) files contain executable bytecode files in the form of Dalvik Executable (DEX) files, which contain the compiled code used to run your app. The Dalvik Executable specification limits the total number of methods that can be referenced within a single DEX file to 65,536—including Android framework methods, library methods, and methods in your own code.
要解决此问题,您需要对代码进行以下更改:
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>
When these configuration settings are added to an app, the Android build tools construct a primary dex (classes.dex) and supporting (classes2.dex, classes3.dex) as needed. The build system will then package them into an APK file for distribution.
请注意: 如果您的代码中已经有 class 从应用程序 class 扩展,那么只需将其更改为从 MultidexApplication 扩展。
playservices 库非常庞大。即使是一个很小的应用程序也可能会遇到这个问题。使用 Proguard 后,由于优化删除了未使用的内容,问题将消失。对于开发(调试构建)——将库限制为您真正使用的库通常会有所帮助。您可以尝试缩小库 or/and 在 compile() gradle 语句中使用 'exclude' 过滤器。
例如,当我需要定位服务时,我使用了:
compile 'com.google.android.gms:play-services:10.2.0'
起初收到了那条消息。将其替换为
compile 'com.google.android.gms:play-services-location:10.2.0'
并顺利解决。