2015-12-22 135 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> 

我希望這將幫助你....

相關問題