每当我按项目构建并准备在我的设备上启动时,我都会收到此错误:
错误:.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构建失败并出现两个错误
所以我有一些问题:
在我停止使用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'
}
答案 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'
并优雅地解决了问题。