2014-12-09 8 views
27

Ho aggiornato Android Studio all'ultima versione, e lascio "aggiustare il progetto" e simili - ma ora il mio progetto non si compila, mi dàDopo l'aggiornamento di AS a 1.0, ottenendo "ID metodo non in [0, 0xffff]: 65536" errore nel progetto

FAILED 

FAILURE: Build failed with an exception. 

* What went wrong: 
Execution failed for task ':app:dexDebug'. 
> com.android.ide.common.internal.LoggedErrorException: Failed to run command: 
    D:\VGA\AndroidStudio\sdk\build-tools\21.1.1\dx.bat --dex --no-optimize --output D:\VGA\Projects\Sales-App\Android-Project\svn\android\app\build\intermediates\dex\debug --input-list=D:\VGA\Projects\Sales-App\Android-Project\svn\android\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:302) 
     at com.android.dx.command.dexer.Main.run(Main.java:245) 
     at com.android.dx.command.dexer.Main.main(Main.java:214) 
     at com.android.dx.command.Main.main(Main.java:106) 

Tuttavia, questo non si risolve con solo multidexing, perché quando ho aggiunto questo:

defaultConfig { 
    ... 
    multiDexEnabled = true 
} 

questo accade

D:\VGA\AndroidStudio\sdk\build-tools\21.1.1\dx.bat --dex --no-optimize --multi-dex --main-dex-list D:\VGA\Projects\Sales-App\Android-Project\svn\android\app\build\intermediates\multi-dex\debug\maindexlist.txt --output D:\VGA\Projects\Sales-App\Android-Project\svn\android\app\build\intermediates\dex\debug --input-list=D:\VGA\Projects\Sales-App\Android-Project\svn\android\app\build\intermediates\tmp\dex\debug\inputList.txt 
Codice

errore: uscita:

UNEXPECTED TOP-LEVEL ERROR: 
java.lang.OutOfMemoryError: GC overhead limit exceeded 
    at com.android.dx.cf.code.ConcreteMethod.makeSourcePosistion(ConcreteMethod.java:254) 
    at com.android.dx.cf.code.RopperMachine.run(RopperMachine.java:306) 
    at com.android.dx.cf.code.Simulator$SimVisitor.visitLocal(Simulator.java:612) 
    at com.android.dx.cf.code.BytecodeArray.parseInstruction(BytecodeArray.java:367) 
    at com.android.dx.cf.code.Simulator.simulate(Simulator.java:94) 
    at com.android.dx.cf.code.Ropper.processBlock(Ropper.java:787) 
    at com.android.dx.cf.code.Ropper.doit(Ropper.java:742) 
    at com.android.dx.cf.code.Ropper.convert(Ropper.java:349) 
    at com.android.dx.dex.cf.CfTranslator.processMethods(CfTranslator.java:280) 
    at com.android.dx.dex.cf.CfTranslator.translate0(CfTranslator.java:137) 
    at com.android.dx.dex.cf.CfTranslator.translate(CfTranslator.java:93) 
    at com.android.dx.command.dexer.Main.processClass(Main.java:729) 
    at com.android.dx.command.dexer.Main.processFileBytes(Main.java:673) 
    at com.android.dx.command.dexer.Main.access$300(Main.java:82) 
    at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:602) 
    at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284) 
    at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166) 
    at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144) 
    at com.android.dx.command.dexer.Main.processOne(Main.java:632) 
    at com.android.dx.command.dexer.Main.processAllFiles(Main.java:505) 
    at com.android.dx.command.dexer.Main.runMultiDex(Main.java:332) 
    at com.android.dx.command.dexer.Main.run(Main.java:243) 
    at com.android.dx.command.dexer.Main.main(Main.java:214) 
    at com.android.dx.command.Main.main(Main.java:106) 

Ho provato a cambiare gli strumenti di costruzione di ultima

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.1" 

A causa di default è cambiato a 20.0.0 che sembrava utilizzare l'SDK per 4.4W , ma questo non ha risolto il mio problema.

Qualcuno sa cosa potrebbe esserci di sbagliato qui?

EDIT:

Cambiare gli strumenti di costruzione o la compilazione SDK non risolvere il problema.

Girando l'applicazione in un progetto multi-dex e anche aggiungendo la seguente

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.1" 

    defaultConfig { 
     ... 
     multiDexEnabled true 
    } 

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

Risolto il processo di generazione, tuttavia questo sembra essere ancora solo un "trattamento", ma non una soluzione al problema.

io non sono sicuro se questo è legato, ma questo è il mio elenco di dipendenze:

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:multidex:1.0.0' 
    compile 'com.android.support:appcompat-v7:21.0.2' 
    compile 'com.squareup:otto:1.3.5' 
    compile 'com.squareup.picasso:picasso:2.4.0' 
    compile 'com.squareup.retrofit:retrofit:1.7.1' 
    compile 'com.jakewharton:butterknife:6.0.0' 
    compile 'com.madgag.spongycastle:core:1.51.0.0' 
    compile 'com.madgag.spongycastle:prov:1.51.0.0' 
    compile 'com.madgag.spongycastle:pkix:1.51.0.0' 
    compile 'com.google.code.gson:gson:2.3' 
    compile 'commons-io:commons-io:2.4' 
    compile 'org.apache.httpcomponents:httpclient-android:4.3.5' 
    compile 'com.squareup.dagger:dagger:1.2.2' 
    compile 'com.squareup.dagger:dagger-compiler:1.2.2' 
    compile('com.googlecode.json-simple:json-simple:1.1.1') { 
     exclude module: 'junit' 
    } 
    compile 'com.google.android.gms:play-services:6.5.87' 
} 

L'unica nuova dipendenza da allora è stato l'ultima riga, che ho aggiunto come da https://developer.android.com/google/gcm/client.html quindi non lo faccio pensa che sia la fonte del problema.

EDIT2:

Sì, è stata la fonte del problema. Come avevo bisogno Google Cloud Messaging, ho sostituito che la dipendenza con la base come da http://developer.android.com/google/play-services/setup.html#split:

compile 'com.google.android.gms:play-services-base:6.5.87' 

Ed è risolto il problema. Grazie per l'aiuto.

Edit3:

Come di servizi di gioco 7.0.0, l'MCG è in

compile 'com.google.android.gms:play-services-gcm:7.0.0' 

edit4:

Play Services aggiornati alla 7.3.0. Ti preghiamo di controllare l'ultima versione qui: http://developer.android.com/google/play-services/setup.html#split

+0

Ho affrontato lo stesso problema .. –

+0

@ MD Ho intenzione di provare a ripristinare lo strumento di build su 19.1.0 e vedere se questo risolve qualcosa, hai trovato qualche soluzione? – EpicPandaForce

+0

L'ho già fatto e funziona bene con gli anziani. –

risposta

20

L'errore indica che hai raggiunto il conteggio del metodo massimo nella tua app. Questo include tutte le librerie che usi per il tuo progetto.

Ci sono due modi per affrontare il problema:

  1. sbarazzarsi di qualsiasi librerie di terze parti che non si ha realmente bisogno. Se utilizzi i servizi di google play che potrebbero contribuire molto al conteggio dei metodi. Fortunatamente, a partire dagli ultimi servizi di gioco, è stato rilasciato il is possible to include only parts del framework.
  2. Utilizzare un multi dex setup per l'applicazione.
+0

Ho provato l'installazione multipla Dex ma il processo di compilazione si è interrotto con un errore di memoria insufficiente. Ho aggiunto il servizio di riproduzione di Google Cloud come dipendenza, ma questa non è la causa del problema. – EpicPandaForce

+0

Bene, ho anche aggiunto memoria extra alle opzioni dex e ora ha funzionato, ma penso che questo sia ancora una sorta di problema di fondo. – EpicPandaForce

+3

Nevermind, che ha aiutato a compilare l'intero Google Play Services, ma con solo la ** base ** ha funzionato correttamente, grazie per il vostro aiuto. – EpicPandaForce

15

Sono in fase di questo problema & nel mio caso utilizzato questi link per superare con successo tale errore .. !!!

The DEX 64k limit is not a problem anymore, almost

Per riassumere, aggiungendo il supporto multidex:

In caso di

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:302) 
    at com.android.dx.command.dexer.Main.run(Main.java:245) 
    at com.android.dx.command.dexer.Main.main(Main.java:214) 
    at com.android.dx.command.Main.main(Main.java:106) 

Google ha deciso di rilasciare una soluzione ufficiale per questo sotto forma di sostegno MultiDex Biblioteca.

dependencies { 
... 
    compile 'com.android.support:multidex:' 
    ... 
} 

quindi attivare multi-Dexing impostando il flag multiDexEnabled nella sezione buildtype o productFlavor della configurazione Gradle.

defaultConfig { 
    ... 
multiDexEnabled true 
... 
} 

Poi a seconda del progetto, si hanno 3 opzioni:

Se non si è creato la propria classe di applicazione, è sufficiente dichiarare android.support.multidex.MultiDexApplication come classe di applicazione in AndroidManifest.xml

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

Se hai già la propria classe Application, renderlo estendere android.support.multidex.MultiDexApplication invece di android.app.Application

Se la classe Application sta estendendo qualche altra classe e non si vuole o non può modificarla, ignorare attachBaseContext() come illustrato di seguito:

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

Il vostro processo di compilazione potrebbe esaurire la memoria. Per risolvere il problema, impostare le seguenti opzioni dex nella chiusura 'Android' -

dexOptions { 
    incremental true 
    javaMaxHeapSize "4g" 
} 

Altro da sapere su multidex è qui: http://developer.android.com/tools/building/multidex.html

Un altro collegamento che diventa contribuire a risolvere un questi errore: Referance Link

+2

@bummi L'ho risolto. – EpicPandaForce