95 votes

Android : Dex ne peut pas analyser le code d'octet de la version 52

Je viens de passer à Android Studio 2.1 et cette erreur est apparue lorsque j'ai essayé de compiler une application qui fonctionnait auparavant :

Error:Error converting bytecode to dex:
Cause: Dex cannot parse version 52 byte code.
This is caused by library dependencies that have been compiled using Java 8 or above.
If you are using the 'java' gradle plugin in a library submodule add 
targetCompatibility = '1.7'
sourceCompatibility = '1.7'
to that submodule's build.gradle file.

J'avais déjà mis à jour le fichier gradle.build du projet principal pour forcer la génération de code Java 1.7 :

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.0'
        apply plugin: 'java'
        sourceCompatibility = 1.7
        targetCompatibility = 1.7
    }
}

J'avais également mis à jour le module gradle.build comme suit pour définir la version de java :

android {
compileSdkVersion 19
buildToolsVersion "23.0.2"

defaultConfig {
    applicationId "com.abc.def"
    minSdkVersion 19
    targetSdkVersion 19
}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }
}
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}
}

Le sous-module est construit avec Maven. Dans le fichier pom.xml, j'ai également essayé de forcer la génération de code 1.7.
Je comprends que j'utilise un artefact d'assemblage, qui incorpore des modules subordonnés, mais je n'ai modifié aucun des modules subordonnés et le fichier .jar résultant pour le module a bien fonctionné la dernière fois que j'ai compilé.

    <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId> <!-- maven-compiler-plugin -->
            <version>2.6</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target> 
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id> <!-- this is used for inheritance merges -->
                    <phase>package</phase> <!-- bind to the packaging phase -->
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Ma question : 1) Est-ce un problème lié à Android Studio 2.1 ? D'autres l'ont-ils constaté ? 2) En supposant que c'est mon erreur et puisque le message d'erreur ne donne aucune aide pour trouver le mauvais module, y a-t-il des recommandations pour trouver le code V52 ? Je ne peux pas simplement omettre les bibliothèques sans casser une grande quantité de code. Peut-on inspecter un fichier .jar pour trouver la révision du code ? Merci d'avance. -Hephaestus

1 votes

Je suis actuellement confronté à cette erreur. Avez-vous une solution ?

0 votes

Moi aussi j'ai mis à jour Android Studio en 2.1. Depuis, je suis confronté à ce problème. Avez-vous trouvé une solution ?

0 votes

Un message d'erreur antérieur (qui a disparu depuis) suggère que le fichier jar pubnub faisait partie du problème. Nous avons donc commenté toutes les références à pubnub et le programme se compile et fonctionne maintenant. Je pense que le message d'erreur a disparu lorsque nous avons ajouté les directives du compilateur (indiquées ci-dessus) pour forcer le code à "1.7", mais il semble qu'une partie du code 1.8 s'échappait encore.

89voto

foolcage Points 964

J'utilise java 1.8 avec Android Studio 3.0+ et le jeu suivant fonctionne pour moi : il semble avoir besoin des derniers outils de construction

classpath 'com.android.tools.build:gradle:3.0.0'

et

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.1"

    defaultConfig {
        ...        
        //jackOptions { // DEPRECATED
            //enabled true
        //}
    }
    dexOptions {
        incremental true
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

1 votes

Merci. Cependant, je suis en train de construire avec le SDK 19 et je constate que vous êtes en 23. Je pensais que Java 8 n'était que pour Android N. Je ne pense pas que je puisse utiliser Java 8 tout en étant rétrocompatible avec 19. Est-ce que je me trompe ?

3 votes

J'ai compilé le code avec java 8 en ciblant Android N, mais j'ai lancé l'application sur Android 16 sans problème. Vous pouvez le tester vous-même

0 votes

16voto

nexDev Points 684

Si vous avez un module avec une bibliothèque java qui est non spécifique à Android cela devrait fonctionner : apply plugin:'java'

Mettez-le en haut du fichier build.gradle, puis reconstruisez.

    apply plugin: 'java'
    apply plugin: 'jacoco'

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        testCompile 'junit:junit:4.11'

        sourceCompatibility = 1.7
        targetCompatibility = 1.7
    }

0 votes

Cool. Merci. Je vais faire un essai.

2 votes

C'est la bonne solution si vous avez un module avec une bibliothèque java qui n'est pas spécifique à Android.

17 votes

Erreur : Le plugin 'java' a été appliqué, mais il n'est pas compatible avec les plugins Android.

8voto

0wl Points 577

Si vous utilisez org.jetbrains:annotation:15 et le plugin retrolambda puis supprimer la ligne compile org.jetbrains:annotations:15.0 de votre build.gradle et l'erreur disparaîtra. Cela fonctionne pour moi.

7voto

fobo66 Points 163

Il est possible que certaines de vos dépendances aient été compilées avec Java 8, et pas spécialement pour Android. Essayez de passer ces dépendances à une version plus ancienne. Je ne sais pas exactement quelle bibliothèque vous devez rétrograder, car vous n'avez pas joint une liste des dépendances de votre module principal.

Par exemple : J'ai eu le même problème. Après des heures de recherche, j'ai trouvé que la bibliothèque org.codehaus.httpcache4j.uribuilder:2.0.0 nécessite Java 8, à partir de github . Donc, quand je suis passé à 1.1.0 Le projet a été construit et déployé avec succès.

0 votes

Fobo66 : Oui, je suis d'accord. C'est à peu près ce que nous avons fait. Je pense, malheureusement, que de plus en plus de bibliothèques seront bientôt compilées avec Java 8 et que ce sera alors un problème courant. Cela ressemble au monde de Python où de nombreuses bibliothèques semblent être encore sur 2.6.

0 votes

Peut-être découvrirons-nous bientôt, comme pour Python, que toutes les bibliothèques sont disponibles séparément en versions J7 et J8.

7voto

vitalinvent Points 119

Essayez d'ajouter au build.gradle principal dans la section tous les projets

tasks.withType(JavaCompile) {
    sourceCompatibility = "1.7"
    targetCompatibility = "1.7"
}

ou ajouter ceci dans Dépendances

    sourceCompatibility = 1.7
    targetCompatibility = 1.7

sur tous les modules manuellement

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