DexException: impossible de fusionner le nouvel index 65536 dans une instruction non jumbo

84

Pour une raison inconnue, mon application ne sera soudainement pas créée à partir d'Android Studio.

Je continue à avoir

> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    /home/martynas/android-sdk/build-tools/19.1.0/dx --dex --num-threads=4 --output
...
...
...
Error Code:
2
Output:
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Cannot merge new index 65536 into a non-jumbo instruction!

Alors que la même application est créée avec succès à partir de la ligne de commande. J'ai vérifié le nombre de références de méthode et c'est bien en dessous des 64k redoutés.

J'utilise AS 0.8.11 maintenant.

Martynas Jurkus
la source

Réponses:

57

Essayez d'ajouter cette ligne sur votre projet.

dex.force.jumbo = vrai

Qui incrémente la limite pour les chaînes dans un fichier dex. Et votre projet sera probablement compilé.

Remarque: également avec le jeu jumbo, il existe une autre limite de 64 Ko uniquement pour les méthodes d'un seul dex. Si vous obtenez cette limite à l'avenir, vous devrez supprimer certaines dépendances.

Mise à jour - Services Google Play 6.5 (12-08-14)

Avec la version 6.5, Google a finalement dégroupé les services Google Play. Ainsi, à partir de maintenant, il sera possible de compiler sélectivement les API dans votre exécutable.

Exemple :

compile 'com.google.android.gms:play-services-maps:6.5.+'
compile 'com.google.android.gms:play-services-ads:6.5.+'

Pour toutes les autres API des services Google Play, consultez cette page sur d.android.com.

Mise à jour (21-04-2015): https://developer.android.com/tools/building/multidex.html

Haresh Chhelana
la source
11
L'ajout à project.propertiesn'a pas fonctionné, j'ai donc mis à jour mon script de construction gradle comme décrit ici: stackoverflow.com/questions/17320088/…
Martynas Jurkus
1
J'ai fait les deux solutions: ajouter la propriété dex.force.jumbo et dexOptions mais je reçois toujours la même erreur. Une autre option?
Juan Saravia
@ juancho, Vérifiez: developer.android.com/google/play-services/setup.html#split
Haresh Chhelana
Merci @HareshChhelana. Pour une raison quelconque, cela a commencé à fonctionner ... mais je n'ai vraiment rien fait de spécial. J'ai des collègues qui compilent le projet sans cette option, mais maintenant cela fonctionne pour moi. Merci!
Juan Saravia
1
au lieu de compiler l'intégralité des services Google Play, j'ai trouvé utile d'utiliser le bundle `` de base '' pour rester en dessous de la limite de dex de 65K:compile 'com.google.android.gms:play-services-base:7.3.0'
kip2
245

Définissez la propriété jumboMode dans build.gradle:

android {
    ...
    dexOptions {
        jumboMode true
    }

}

J'ai également trouvé cela utile: Affichage du nombre de méthodes dex par package .

lydia_schiff
la source
12
Merci! Ça marche pour moi aussi. Mais que signifie ce "jumboMode"?
yital9
3
@ yital9, vous pouvez en savoir plus sur le mode jumbo ici: stackoverflow.com/a/30517283/4034572
Albert Vila Calvo
veuillez expliquer la raison de ce blocage
eC Droid
J'ai ajouté ce type de construction de débogage interne seul car la version de version se déroule bien, à cause de proguard. La version de débogage s'est bien déroulée après cette modification. Est-ce bien?
grenat du
1
Cela fonctionne pour moi. Notez que le build.gradle à modifier doit être le module qui lance com.android.dex.DexException.
Francis Bacon
54

Cela fonctionne pour moi. Je recevaiscom.android.dex.DexIndexOverflowException: Cannot merge new index 66636 into a non-jumbo instruction!

android {
    ...
    dexOptions {
        jumboMode true
    }
}

Si cela ne fonctionne pas, vous avez peut-être atteint la limite de référence de méthode dans dex, ce qui est un problème différent. Vous devez utiliser multidex ou proGuard.

Sayooj
la source
C'est du travail pour moi. Merci!!! mais qu'est-ce que «jumboMode»? Pouvez-vous m'expliquer? @Sayooj
DG
13

Il s'agit d'un bogue dans la fusion lorsque les fichiers dex qui sont fusionnés ont plus de 65536 chaînes. Le nouvel index ne peut pas tenir dans une instruction const-string, et la fusion dex ne prend pas en charge la modification des instructions si elles sont de tailles différentes, il ne peut donc pas être élargi à une instruction const-string / jumbo. jb-mr1 en ajoutant une nouvelle option: --force-jumbo. Ce bogue peut être corrigé en ajoutant "dex.force.jumbo=true"à project.properties.

goonerDroid
la source
1
@DeepakSharma Vous devez nettoyer votre projet après avoir activé jumboMode
Lilo
-1

Avec le dernier Android Studio et le drapeau "force jumbo" coché dans les paramètres du compilateur Android Studio, ce problème disparaît.

Samouraï
la source
3
Si c'est possible, ajoutez quelques détails dans votre réponse, plz.
shA.t