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