2014-12-16 16 views
5

All'improvviso mi sto imbattendo in questo problema durante la creazione/esecuzione del mio progetto.Strumenti di compilazione 21.1.2 - ECCEZIONE DI LIVELLO SUPERIORE INASPETTATO

Error:Execution failed for task ':app:dexDebug'. 
> com.android.ide.common.internal.LoggedErrorException: Failed to run command: 
    /Users/aidanfollestad/Documents/android-sdk/build-tools/21.1.2/dx --dex --no-optimize --output /Users/aidanfollestad/Android Projects/Impression/app/build/intermediates/dex/debug --input-list=/Users/aidanfollestad/Android Projects/Impression/app/build/intermediates/tmp/dex/debug/inputList.txt 
    Error Code: 
    2 
    Output: 
    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:277) 
     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:454) 
     at com.android.dx.command.dexer.Main.runMonoDex(Main.java:303) 
     at com.android.dx.command.dexer.Main.run(Main.java:246) 
     at com.android.dx.command.dexer.Main.main(Main.java:215) 
     at com.android.dx.command.Main.main(Main.java:106) 

Il mio file Gradle contiene questo:

buildscript { 
    repositories { 
     maven { url 'https://maven.fabric.io/public' } 
    } 

    dependencies { 
     classpath 'io.fabric.tools:gradle:1.14.+' 
    } 
} 
apply plugin: 'com.android.application' 
apply plugin: 'io.fabric' 
apply plugin: 'versionPlugin' 

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     applicationId "com.afollestad.impression" 
     minSdkVersion 16 
     targetSdkVersion 21 
     versionCode 19 
     versionName "0.7.0" 
    } 
} 

repositories { 
    mavenCentral() 
    maven { url 'https://maven.fabric.io/public' } 
} 

dependencies { 
    compile 'com.android.support:appcompat-v7:21.0.+' 
    compile 'com.android.support:recyclerview-v7:21.0.+' 
    compile 'com.koushikdutta.ion:ion:2.0.+' 
    compile 'com.github.chrisbanes.photoview:library:1.2.+' 
    compile 'com.afollestad:material-dialogs:0.4.5' 
    compile 'com.google.android.gms:play-services:6.5.87' 

    compile 'com.google.api-client:google-api-client:1.18.0-rc' 
    compile 'com.google.api-client:google-api-client-android:1.18.0-rc' 
    compile 'com.google.api-client:google-api-client-gson:1.18.0-rc' 
    compile 'com.google.apis:google-api-services-drive:v2-rev152-1.19.0' 

    compile('com.crashlytics.sdk.android:crashlytics:[email protected]') { 
     transitive = true; 
    } 
} 

versionPlugin{ 
    buildTypesMatcher = 'release' 
    supportBuildNumber = false 
    fileNameFormat = '$appPkg-v$versionName-$versionCode' 
} 

mio materiale-finestre di dialogo di libreria riferimenti solo AppCompat-V7, la stessa versione questo file Gradle fa riferimento. Non ho JAR nella mia cartella di libs a cui sto riferendo. Non ho idea di quali librerie interferiscano tra loro (a parte la possibilità di Play Services e AppCompat?). Qualche idea o soluzione?

Ho notato riferimenti ionici v4 della libreria di supporto (https://github.com/koush/ion/blob/master/ion/build.gradle#L17), forse potrebbe interferire con AppCompat?

+0

@ Scott-Barta questo non è un duplicato, che altra risposta non risolve il problema. – afollestad

+1

L'ho riaperto, ma in effetti è un duplicato: ci sono troppi metodi per contenere un file dex. Non è una collisione. –

+1

Se non utilizzi tutti i servizi Google Play, prendi in considerazione l'utilizzo di [dipendenze divise] (https://developer.android.com/google/play-services/setup.html#split) che ti consentono di dipendere solo sulle parti dei servizi Google Play di cui hai effettivamente bisogno. – ianhanniballake

risposta

12

tenta di attivare build.gradle multidex:

android { 
    defaultConfig { 
     ... 
     multiDexEnabled = true 
    } 
} 

Rif: Unable to execute dex: method ID not in [0, 0xffff]: 65536

+1

usando 'multiDexEnabled' come è con le sue limitazioni. Cerca di evitarlo, se possibile. – Shubham

+0

@Shubham puoi approfondire i limiti? – Jus12

+1

@ Jus12: leggi tutto qui. http://developer.android.com/tools/building/multidex.html – Shubham

11

Si può hitted il limite di 65k metodi. Invece di utilizzare MultiDex, prova a utilizzare Google Play Services con maggiore granularità. Follow this guide, è possibile utilizzare solo le parti che si desidera. Probabilmente questo risolverà il tuo problema.

+1

Questo è un eccellente consiglio, non è necessario abilitare multiDex (che sembra aver causato altri problemi) quando è possibile aggiungere solo le parti specifiche di Google Play Servizi che sono necessari – Leon

2

Questa eccezione dimostra che il progetto ha raggiunto al massimo numero di metodi 65536. basta fare il sotto work.It ha lavorato per me

Fase 1:
all'interno build.gradle

 defaultConfig { 
     multiDexEnabled = true 
     } 

fase 2:

all'interno del tag manifesto dell'applicazione

android:name="android.support.multidex.MultiDexApplication" 

    or 

Fase 3: Se si utilizza Class che si estende Applicazione poi fare:

public class MyApplication extends Application { 
    @Override 
    protected void attachBaseContext(Context base) { 
    super.attachBaseContext(base); 
    MultiDex.install(this); 
    } 
    } 

Fase 4:

all'interno build.gradle

android{ 
    dexOptions { 
    incremental true 
    javaMaxHeapSize "4g" 
    } 
    }