2015-12-22 78 views
2

我试图在我的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 \斌\ 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:[email protected]') { 
     transitive = true; 
    } 
} 

我搜索在谷歌的问题,并发现超过65,536方法限制在DEX文件

com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536 

这个问题的国家,但我的项目是不是足够大。

请告诉我我做错了什么,并提出解决方法。 谢谢。

+1

从而起到服务模块使用? – Veer3383

+0

请检查我的答案http://stackoverflow.com/questions/32844287/java-finished-with-non-zero-exit-value-1-android-gradle/32844773#32844773 –

+0

@ Veer3383我使用位置的API使用GoogleApiClient获取当前位置。 –

回答

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' 
} 

Reference Link

其他的解决办法是通过优化您的ProGuard的方法,它可以通过

minifyEnabled true 

部分启用。

此外,您可以优化您的依赖关系,以避免超过65K方法计数限制。 检出这site,以获得指示安装一个插件的权利,Android Studio将显示您的build.gradle并排每个依赖项的方法计数。考虑到这一点,您可以决定要保留哪种依赖关系,以及哪种方法可以用更少的方法来取代。

+0

此解决方案适用于我。谢谢。 但我仍想知道我的应用程序是如何突破的65K最大方法数限制,对于任何具体的原因是什么? –

+0

@GaganSingh指我在答案底部添加的网站链接。有一个选项可以直接在Android Studio中安装插件。你可以使用它来找到哪个依赖是罪魁祸首。 –

+0

我明白了。我认为Google Play服务有超过65k的方法,因此在使用播放服务后,我得到了这个错误。谢谢你的帮助。 :) –

1

请参阅此link

有时,大型库依赖性也可能导致符号大小上升。这个链接通过类似proguard的方式谈论避免65K的限制。

或者你可以简单地使用多重分解,这将在达到大的符号大小时为你创建2个classes.dex文件。

3

不要包括整个播放服务的依赖,

与您只使用模块更换

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

例如,

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

Rerfer this您refrence,

柜面你需要包括播放业务的所有模块,

参考基数的回答

2

基本上这是因为你超过限制造成的你有两个选择来解决这个错误。

1)降低没有在您的项目方法。基本上你在你的项目中添加方法库也算在你的项目的方法。所以不要使用该库的全包使用您在项目中使用的模块:比如谷歌玩你加全包添加你想要使用像地图等模块的服务..

2)第二个启用该multidex为使multidex: 现在,所有你需要做的是在你的应用类中重写此:

public class YouApplication extends Application { 

@Override 
protected void attachBaseContext(Context base) { 
    super.attachBaseContext(base); 
    MultiDex.install(this); 
} 

} 

在gradal

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类从多DEX支持库的应用程序元素这样

<?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> 

我希望这将帮助你....