347 votes

Impossible d'exécuter dex: l'ID de la méthode n'est pas dans [0, 0xffff]: 65536

J'ai déjà vu différentes versions des dex erros, mais celle-ci est nouvelle. nettoyer / redémarrer, etc ne va pas aider. Les projets de bibliothèque semblent intacts et la dépendance semble être liée correctement.

 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
 

379voto

Alex Lipov Points 990

Multi-dex soutien résout ce problème. dx 1.8 déjà permet de générer plusieurs fichiers dex.
Android L va prendre en charge multi-dex en natif, et de la prochaine révision de la bibliothèque de prise en charge est de couvrir les anciennes versions de retour à l'API 4.
Il a été indiqué dans le présent Développeurs Android Coulisses de l'épisode de podcast par Anwar Ghuloum. J'ai posté une transcription (et en général multi-dex explication) de la partie concernée.

Mise à jour (10/17/2014):
Comme prévu, multidex soutien est fourni dans la révision 21 de Android Support Library. Vous pouvez trouver l'android-support-multidex.jar dans /sdk/extras/android/support/multidex/bibliothèque/dossier libs.

Mise à jour (10/31/2014)
Plugin Gradle v0.14.0 pour Android ajoute le support pour le Multi-Dex. Pour l'activer, il vous suffit de les déclarer dans le construire.gradle:

android {
   defaultConfig {
      ...
      multiDexEnabled = true
   }
}

Mise à jour (11/3/2014)
Google a finalement publié une description officielle.

57voto

blobbie Points 561

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

12voto

mcm Points 114

Le code ci-dessous permet, si vous utilisez Gradle. Vous permet de supprimer les services de Google (en supposant que vous utilisez) pour revenir en dessous de la 65k seuil. Tout le crédit de ce poste: https://gist.github.com/dmarcato/d7c91b94214acd936e42

Edit 2014-10-22: Il y a eu beaucoup de discussion intéressante sur l'essentiel, référencé ci-dessus. TLDR? regardez celui-ci: https://gist.github.com/Takhion/10a37046b9e6d259bb31

Collez ce code dans le bas de votre build.gradle dossier et de modifier la liste des services google, vous n'avez pas besoin:

def toCamelCase(String string) {
    String result = ""
    string.findAll("[^\\W]+") { String word ->
        result += word.capitalize()
    }
    return result
}

afterEvaluate { project ->
    Configuration runtimeConfiguration = project.configurations.getByName('compile')
    ResolutionResult resolution = runtimeConfiguration.incoming.resolutionResult
    // Forces resolve of configuration
    ModuleVersionIdentifier module = resolution.getAllComponents().find { it.moduleVersion.name.equals("play-services") }.moduleVersion

    String prepareTaskName = "prepare${toCamelCase("${module.group} ${module.name} ${module.version}")}Library"
    File playServiceRootFolder = project.tasks.find { it.name.equals(prepareTaskName) }.explodedDir

    Task stripPlayServices = project.tasks.create(name: 'stripPlayServices', group: "Strip") {
        inputs.files new File(playServiceRootFolder, "classes.jar")
        outputs.dir playServiceRootFolder
        description 'Strip useless packages from Google Play Services library to avoid reaching dex limit'

        doLast {
            copy {
                from(file(new File(playServiceRootFolder, "classes.jar")))
                into(file(playServiceRootFolder))
                rename { fileName ->
                    fileName = "classes_orig.jar"
                }
            }
            tasks.create(name: "stripPlayServices" + module.version, type: Jar) {
                destinationDir = playServiceRootFolder
                archiveName = "classes.jar"
                from(zipTree(new File(playServiceRootFolder, "classes_orig.jar"))) {
                    exclude "com/google/ads/**"
                    exclude "com/google/android/gms/analytics/**"
                    exclude "com/google/android/gms/games/**"
                    exclude "com/google/android/gms/plus/**"
                    exclude "com/google/android/gms/drive/**"
                    exclude "com/google/android/gms/ads/**"
                }
            }.execute()
            delete file(new File(playServiceRootFolder, "classes_orig.jar"))
        }
    }

    project.tasks.findAll { it.name.startsWith('prepare') && it.name.endsWith('Dependencies') }.each { Task task ->
        task.dependsOn stripPlayServices
    }
}

6voto

mmin Points 116

J’ai partagé un exemple de projet qui résout ce problème en utilisant le script de compilation custom_rules.xml et quelques lignes de code.

Je l’ai utilisé sur mon propre projet et il est fonctionne impeccable sur 1 + périphériques (à partir d’android-8 au dernier android-19). Elle pourra être qu'utile.

https://github.com/mmin18/Dex65536

2voto

shimi_tap Points 538

La solution idéale pour cela serait de travailler avec Proguard. comme aleb mentionné dans le commentaire. Cela diminuera de moitié la taille du fichier dex.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X