J'ai déjà vu différentes versions des err dex, mais celle-ci est nouvelle. nettoyer / redémarrer, etc. n'aidera pas. Les projets de bibliothèque semblent intacts et la dépendance semble être correctement liée.
Unable to execute dex: method ID not in [0, 0xffff]: 65536
Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536
ou
Cannot merge new index 65950 into a non-jumbo instruction
ou
java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
tl; dr : La solution officielle de Google est enfin là!
http://developer.android.com/tools/building/multidex.html
Une seule petite astuce, vous aurez probablement besoin de le faire pour éviter de manquer de mémoire lors de la dex-ing.
dexOptions {
javaMaxHeapSize "4g"
}
Il existe également un mode jumbo qui peut résoudre ce problème de manière moins fiable:
dexOptions {
jumboMode true
}
Mise à jour: si votre application est grasse et que vous avez trop de méthodes à l'intérieur de votre application principale, vous devrez peut-être réorganiser votre application selon
http://blog.osom.info/2014/12/too-many-methods-in-main-dex.html
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
celle-là que vous n'appelez pas cette fonction si elle n'est pas disponible?Réponses:
Mise à jour 3 (11/3/2014)
Google a finalement publié la description officielle .
Mise à jour 2 (31/10/2014) Le
plugin Gradle v0.14.0 pour Android ajoute la prise en charge du multi-dex. Pour l'activer, il vous suffit de le déclarer dans build.gradle :
Si votre application prend en charge Android avant 5.0 (c'est-à-dire si vous avez
minSdkVersion
20 ans ou moins), vous devez également corriger dynamiquement l' application ClassLoader , afin qu'elle puisse charger des classes à partir de dex secondaires. Heureusement, il y a une bibliothèque qui fait ça pour vous. Ajoutez-le aux dépendances de votre application:Vous devez appeler le code du correctif ClassLoader dès que possible.
MultiDexApplication
La documentation de la classe suggère trois façons de le faire (choisissez-en une , celle qui vous convient le mieux):1 - Déclarez la
MultiDexApplication
classe comme application dans votre AndroidManifest.xml :2 - Demandez à votre
Application
classe d'étendre la classe MultiDexApplication :3 - Appelez
MultiDex#install
depuis votreApplication#attachBaseContext
méthode:Mise à jour 1 (17/10/2014):
comme prévu, la prise en charge multidex est fournie dans la révision 21 de la bibliothèque de support Android. Vous pouvez trouver le dossier android-support-multidex.jar dans le dossier / sdk / extras / android / support / multidex / library / libs.
Le support multi-dex résout ce problème. dx 1.8 permet déjà de générer plusieurs fichiers dex.
Android L prendra en charge le multi-dex en natif, et la prochaine révision de la bibliothèque de support va couvrir les anciennes versions de retour à l'API 4.
Il a été déclaré dans cet épisode de podcast Android Developers Backstage par Anwar Ghuloum. J'ai posté une transcription (et une explication générale multi-dex) de la partie pertinente.
la source
java.lang.ClassNotFoundException: Didn't find class "org.qtproject.qt5.android.QtActivityDelegate" on path: DexPathList[[],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
. Il s'est avéré que mon erreur était que je n'appliquais pas les étapes supplémentaires pour le support Android avant 5.0. Cela dit, l'option n ° 3 l'a résolu et je n'ai plus eu deClassNotFoundException
problème. Merci, @Alex Lipov!Comme déjà indiqué, vous avez trop de méthodes (plus de 65k) dans votre projet et vos librairies.
Prévention du problème: réduisez le nombre de méthodes avec Play Services 6.5+ et support-v4 24.2+
Depuis souvent, les services Google Play sont l'un des principaux suspects dans les méthodes de «gaspillage» avec ses méthodes 20k + . Services Google Play version 6.5 ou ultérieure, il vous est possible d'inclure des services Google Play dans votre application à l'aide d'un certain nombre de bibliothèques clientes plus petites. Par exemple, si vous n'avez besoin que de GCM et de cartes, vous pouvez choisir d'utiliser uniquement ces dépendances:
La liste complète des sous-bibliothèques et de ses responsabilités se trouve dans le doc officiel de Google .
Mise à jour : depuis la bibliothèque de support v4 v24.2.0, elle a été divisée en modules suivants:
Notez cependant que si vous utilisez
support-fragment
, il aura des dépendances avec tous les autres modules (c.-à-d. Si vous utilisezandroid.support.v4.app.Fragment
il n'y a aucun avantage)Voir ici les notes de version officielles de support-v4 lib
Activer MultiDexing
Depuis Lollipop (aka build tools 21+), il est très facile à manipuler. L'approche consiste à contourner le problème des méthodes 65k par fichier dex pour créer plusieurs fichiers dex pour votre application. Ajoutez ce qui suit à votre fichier de construction Gradle ( cela provient du document officiel de Google sur les applications avec plus de 65 000 méthodes ):
La deuxième étape consiste à préparer votre classe d'application ou, si vous ne développez pas l'application, utilisez le
MultiDexApplication
dans votre manifeste Android:Soit ajoutez ceci à votre Application.java
ou utilisez l'application fournie à partir de la bibliothèque mutlidex
Empêcher OutOfMemory avec MultiDex
Comme autre conseil, si vous rencontrez des
OutOfMemory
exceptions pendant la phase de construction, vous pouvez agrandir le tas avecce qui mettrait le tas à 4 gigaoctets.
Consultez cette question pour plus de détails sur le problème de la mémoire de tas dex.
Analyser la source du problème
Pour analyser la source des méthodes, le plugin gradle https://github.com/KeepSafe/dexcount-gradle-plugin peut aider en combinaison avec l'arbre de dépendance fourni par gradle avec par exemple
Voir cette réponse et cette question pour plus d'informations sur le nombre de méthodes dans Android
la source
Votre projet est trop grand. Vous avez trop de méthodes. Il ne peut y avoir que 65536 méthodes par application. voir ici https://code.google.com/p/android/issues/detail?id=7147#c6
la source
Le code ci-dessous est utile si vous utilisez Gradle. Vous permet de supprimer facilement les services Google inutiles (en supposant que vous les utilisez) pour revenir en dessous du seuil de 65k. Tous les crédits à ce poste: https://gist.github.com/dmarcato/d7c91b94214acd936e42
Edit 2014-10-22 : Il y a eu beaucoup de discussions intéressantes sur l'essentiel référencé ci-dessus. TLDR? regard sur celui - ci: https://gist.github.com/Takhion/10a37046b9e6d259bb31
Collez ce code au bas de votre fichier build.gradle et ajustez la liste des services google dont vous n'avez pas besoin:
la source
clean
chaque fois que je singe avec les exclus (nous utilisons des analyses).J'ai partagé un exemple de projet qui résout ce problème en utilisant le script de construction custom_rules.xml et quelques lignes de code.
Je l'ai utilisé sur mon propre projet et il fonctionne parfaitement sur les appareils 1M + (d'Android-8 au dernier Android-19). J'espère que cela aide.
https://github.com/mmin18/Dex65536
la source
J'ai rencontré le même problème et l'ai résolu en modifiant mon fichier build.gradle dans la section des dépendances, en supprimant:
Et en le remplaçant par:
la source
Essayez d'ajouter le code ci-dessous dans build.gradle, cela a fonctionné pour moi -
la source
La solution parfaite pour cela serait de travailler avec Proguard. comme Aleb mentionné dans le commentaire. Cela réduira de moitié la taille du fichier dex.
la source
Vous pouvez analyser le problème (références de fichiers dex) à l'aide d'Android Studio:
Créer -> Analyser APK ..
Dans le panneau de résultats, cliquez sur le fichier classes.dex
Et vous verrez:
la source
solution gradle + proguard:
la source
Supprimez un fichier jar du dossier Libs et copiez-le dans un autre dossier, puis accédez à _Project Properties> Select Java Build Path, Select Libraries, Select Add External Jar, Select the Removed jar to your project, Click save, this will be added under Referenced Bibliothèque au lieu du dossier Libs. Maintenant, nettoyez et exécutez votre projet. Vous n'avez pas besoin d'ajouter de code pour MultDex. Cela a simplement fonctionné pour moi.
la source
J'étais confronté au même problème aujourd'hui, ce qui a fonctionné est en dessous
Pour ANDROID STUDIO ... Activer l'exécution instantanée
Dans Fichier-> Préférences-> Build, Execution, Deployment-> Instant Run-> Cochez Enable Instant run for hot swap ...
J'espère que cela aide
la source