我尝试在build.gradle文件中添加Google Play商店服务,同步成功。现在,当我尝试运行应用程序时,我在Android Studio中遇到以下异常:
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
at com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:502)
at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:283)
at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:491)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:168)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)
at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:502)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)
at com.android.dx.command.dexer.Main.run(Main.java:277)
at com.android.dx.command.dexer.Main.main(Main.java:245)
at com.android.dx.command.Main.main(Main.java:106)
Error:Execution failed for task ':app:dexDebug'.
com.android.ide.common.process.ProcessException:org.gradle.process.internal.ExecException:进程'命令'C:\ Program Files \ Java \ jdk1.8.0_60 \ bin \ java.exe''已完成具有非零退出值2
在添加播放服务之前,它运行正常。我的build.gradle文件如下所示:
buildscript {
repositories {
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
classpath 'io.fabric.tools:gradle:1.+'
}
}
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
applicationId 'com.xyz.app'
minSdkVersion 15
targetSdkVersion 23
versionCode 2
versionName "1.0.1"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors {
}
}
repositories {
mavenCentral()
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
compile 'me.neavo:volley:2014.12.+'
compile 'com.google.code.gson:gson:2.2.+'
compile 'com.facebook.android:facebook-android-sdk:4.7.0'
compile 'com.google.android.gms:play-services:8.4.0'
compile('com.crashlytics.sdk.android:crashlytics:2.5.5@aar') {
transitive = true;
}
}
我在Google上搜索了这个问题,发现该问题超出了dex文件中65,536种方法的限制
com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
但我的项目还不够大。
请告诉我我做错了什么并建议解决问题的方法。 感谢。
答案 0 :(得分:4)
您的最大方法计数限制超过65K。 对此的一个解决方案是在gradle中使用multidex选项。
修改build.gradle,如下所示
android {
...
defaultConfig {
...
minSdkVersion 14
targetSdkVersion 23
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.0'
}
其他解决方案是通过proguard优化您的方法,可以通过
启用minifyEnabled true
部分。
另外,您可以优化您的依赖关系,以避免超过65K方法计数限制。 查看此site,获取有关在Android Studio中安装插件的说明,该插件将并排显示build.gradle中每个依赖项的方法计数。考虑到这一点,您可以决定保留哪个依赖项,哪个可以用更少方法饥饿的东西替换。
答案 1 :(得分:3)
不要包含整个播放服务依赖项,
替换
compile 'com.google.android.gms:play-services:8.4.0'
只使用您正在使用的模块。
例如
compile 'com.google.android.gms:play-services-location:8.4.0'
Rerfer this表示您的参考,
如果您需要将播放服务包含在所有模块中,
参考Radix的回答
答案 2 :(得分:2)
基本上这是因为你超出了方法的限制。你有两个选项来解决这个错误。
1)减少项目中方法的数量。基本上,在项目方法中添加的库也会计入项目方法中。所以不要使用该库的整个包使用您在项目中使用的模块:例如,您添加整个包的Google Play服务添加您想要使用的模块,如地图等。
2)第二个启用multidex以启用multidex: 现在,您需要做的就是在Application类中覆盖它:
public class YouApplication extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
在gradal中添加multidex支持库
android {
compileSdkVersion 22
buildToolsVersion "23.0.0"
defaultConfig {
minSdkVersion 14 //lower than 14 doesn't support multidex
targetSdkVersion 22
// Enabling multidex support.
multiDexEnabled true
}
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
在清单中,将Multidex支持库中的MultiDexApplication类添加到这样的应用程序元素
<?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>
我希望这会帮助你......
答案 3 :(得分:1)
请参阅此Assignments。
有时,大型库依赖项也会导致符号大小上升。这个链接通过像proguard这样的方式谈论避免65K限制。
或者你可以简单地使用multidexing,它会在达到大符号大小时为你创建2个classes.dex文件。