web-dev-qa-db-fra.com

Après la mise à jour de AS vers 1.0, obtention de l'erreur "ID de méthode non dans [0, 0xffff]: 65536" dans le projet

J'ai mis à jour Android Studio vers la dernière version, et je l'ai laissé "réparer le projet" et autres - mais maintenant mon projet ne compile pas, me donne

 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)

Cependant, cela n'est pas résolu par le multidexing, car lorsque j'ai ajouté ceci:

defaultConfig {
    ...
    multiDexEnabled = true
}

Ça arrive

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

Code d'erreur: 3 Sortie:

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)

J'ai essayé de changer les outils de construction pour les derniers

Android {
    compileSdkVersion 21
    buildToolsVersion "21.1.1"

Parce que par défaut, il est passé à 20.0.0 qui semblait utiliser le SDK pour 4.4W, mais cela n'a pas résolu mon problème.

Quelqu'un sait-il ce qui pourrait mal se passer ici?

MODIFIER:

La modification des outils de génération ou du SDK de compilation n'a pas résolu le problème.

Transformer l'application en projet multi-dex et ajouter également les éléments suivants

Android {
    compileSdkVersion 21
    buildToolsVersion "21.1.1"

    defaultConfig {
        ...
        multiDexEnabled true
    }

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

Correction du processus de construction, mais cela ne semble toujours être qu'un "traitement" mais pas une solution au problème.

Je ne sais pas si cela est lié, mais voici ma liste de dépendances:

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

La seule nouvelle dépendance depuis lors a été la dernière ligne, que j'ai ajoutée selon https://developer.Android.com/google/gcm/client.html donc je ne pense pas que ce soit le source du problème.

EDIT2:

Oui, c'était la source du problème. Comme j'avais besoin Google Cloud Messaging, J'ai remplacé cette dépendance par la base selon http://developer.Android.com/google/play-services/setup.html#split :

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

Et cela a résolu le problème. Merci pour l'aide.

EDIT3:

Depuis les services de jeu 7.0.0, le GCM est en

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

EDIT4:

Play Services mis à jour vers 7.3.0. Veuillez vérifier la dernière version ici: http://developer.Android.com/google/play-services/setup.html#split

27
EpicPandaForce

L'erreur signifie que vous avez atteint le nombre maximal de méthodes dans votre application. Cela inclut toutes les bibliothèques que vous utilisez pour votre projet.

Il existe deux façons de résoudre le problème:

  1. Débarrassez-vous des bibliothèques tierces dont vous n'avez pas vraiment besoin. Si vous utilisez les services google play, cela pourrait beaucoup contribuer au nombre de méthodes. Heureusement, depuis la dernière version des services de jeu, il il est possible d'inclure uniquement des parties du cadre.
  2. Utilisez un configuration multi dex pour votre application.
20
Konstantin Burov

J'élimine ces problèmes et dans mon cas, j'ai utilisé ces liens pour surmonter cette erreur avec succès .. !!!

La limite DEX 64k n'est plus un problème, presque

Pour résumer, en ajoutant le support multidex:

En cas de

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 a décidé de publier une solution officielle pour cela sous la forme de la bibliothèque de support MultiDex.

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

Activez ensuite le multi-dexage en définissant l'indicateur multiDexEnabled dans la section buildType ou productFlavor de votre configuration gradle.

defaultConfig { 
   ... 
multiDexEnabled true 
... 
}

Ensuite selon votre projet, vous avez 3 options:

Si vous n'avez pas créé votre propre classe d'application, déclarez simplement Android.support.multidex.MultiDexApplication comme classe d'application dans AndroidManifest.xml

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

Si vous avez déjà votre propre classe Application, faites-la étendre Android.support.multidex.MultiDexApplication Au lieu de Android.app.Application

Si votre classe Application étend une autre classe et que vous ne souhaitez pas ou ne pouvez pas la modifier, remplacez attachBaseContext() comme indiqué ci-dessous:

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

Votre processus de compilation peut manquer de mémoire. Pour y remédier, définissez les options dex suivantes dans la fermeture "Android" -

dexOptions { 
   incremental true 
   javaMaxHeapSize "4g" 
}

Pour en savoir plus sur le multidex, cliquez ici: http://developer.Android.com/tools/building/multidex.html

Un autre lien qui aide à résoudre une de ces erreurs: Lien de référence

15
Dhruv Raval