Android: Dex ne peut pas analyser le code de la version 52 octets

93

Je viens de passer à Android Studio 2.1 et cette erreur est apparue lors de la tentative de compilation d'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 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 en cours de construction 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 changé 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 avec Android Studio 2.1? Les autres l'ont-ils vu? 2) En supposant qu'il s'agit de mon erreur et que le message d'erreur ne m'aide pas à 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 de code? Merci d'avance. -Héphaïstos

Héphaïstos
la source
1
Je suis actuellement confronté à cette erreur. Une chance pour des solutions?
MetaSnarf
Moi aussi j'ai mis à jour Android Studio vers 2.1. Depuis, je suis confronté à ce problème. Avez-vous une solution?
Suresh Kumar
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é chaque référence à pubnub et il se compile et s'exécute maintenant. Je crois que le message d'erreur a disparu lorsque nous avons ajouté les directives du compilateur (ci-dessus) pour forcer le code à "1.7", mais il semble qu'une partie du code 1.8 fuyait toujours.
Hephaestus
Voici une autre discussion SO qui concerne: stackoverflow.com/questions/36968728/… . Mais ce qui ne répond pas à la question, si ce n'est de dire "commencer par un projet de test plus simple".
Héphaïstos
1
La seule chose que nous avons faite a été de retirer la bibliothèque PubNub et de la remplacer par une version plus ancienne. Cela a semblé résoudre le problème. Mais dans ce cas, nous avons testé en commentant l'importation de la bibliothèque et ses appels de méthode et en déterminant qu'elle était en faute. Mais la bibliothèque PubNub était vaguement intégrée et nous pouvions la commenter assez facilement. Si nous avions de nombreuses bibliothèques avec une intégration étroite, ce serait douloureux.
Hephaestus

Réponses:

89

utilisez simplement java 1.8 avec Android Studio 3.0+ et définissez les fonctions suivantes: 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
    }
}
imbécile
la source
1
Je vous remercie. Cependant, je construis au SDK 19 et je note que vous êtes sur 23. Je pensais que Java 8 était uniquement pour Android N. Je ne pense pas que je peux utiliser Java 8 et être toujours rétrocompatible avec 19. Est-ce que je me trompe?
Hephaestus
3
J'ai compilé du code avec java 8 en ciblant Android N, mais j'ai exécuté l'application sur Android 16 sans problème. Vous pouvez le tester vous
Deepscorn
7
Apparemment, dexOptions.incremental n'est plus requis car il est par défaut true, voir stackoverflow.com/questions/37522668
devconsole
1
Veuillez vous assurer que vous comprenez les limites de l'utilisation de java 8 et que toutes les fonctionnalités linguistiques ne sont pas rétrocompatibles. developer.android.com/guide/platform/j8-jack.html
TrevJonez
3
Notez que «La android.dexOptions.incrementalpropriété est obsolète et n'a aucun effet sur le processus de génération».
Jonik
16

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

Placez-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
    }
nexDev
la source
Cool. Merci. Je vais essayer.
Hephaestus
2
C'est la bonne solution si vous avez un module avec une bibliothèque java qui n'est pas spécifique à Android.
heureux
17
Erreur: le plugin 'java' a été appliqué, mais il n'est pas compatible avec les plugins Android.
Alen Siljak
1
D'accord. Le plugin 'java' est apparemment incompatible avec les plugins Android. Pas de joie.
Hephaestus
1
@Alen Siljak, appliquez le plugin: 'votre nom de plugin' n'a pas besoin d'être java.
nexDev
8

Si vous utilisez org.jetbrains:annotation:15et retrolambda plugin, supprimez la ligne compile org.jetbrains:annotations:15.0de votre build.gradleet l'erreur disparaîtra. Ça marche pour moi.

0wl
la source
7

Peut-être que certaines de vos dépendances ont été compilées avec Java 8, pas spécialement pour Android. Essayez de basculer ces dépendances vers une version plus ancienne. Je ne sais pas exactement quelle bibliothèque vous devriez rétrograder, car vous n'avez pas joint une liste de 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.0nécessite Java 8, à partir de github . Ainsi, lorsque je suis passé à 1.1.0, le projet a été construit et déployé avec succès.

fobo66
la source
fobo66: Oui, je suis d'accord. C'est à peu près ce que nous avons fait. Je pense que, malheureusement, de plus en plus de bibliothèques seront bientôt compilées avec Java 8 et ce sera alors un problème courant. Cela ressemble au monde de Python où de nombreuses bibliothèques semblent toujours être sur 2.6.
Héphaïstos
Peut-être verrons-nous bientôt, comme Python, que toutes les bibliothèques sont disponibles séparément en tant que versions J7 et J8.
Héphaïstos
7

Essayez d'ajouter à build.gradle principal dans la section allprojects

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

ou ajoutez ceci dans les dépendances

    sourceCompatibility = 1.7
    targetCompatibility = 1.7

dans tous les modules manuellement

vitalinvent
la source
7

J'ai pu résoudre ce problème en ajoutant les lignes suivantes:

jackOptions {
    enabled true
}

à defaultConfigdans le build.gradlefichier.

Vous pouvez suivre les instructions pour Java 8 sur le lien - https://developer.android.com/guide/platform/j8-jack.html

Faisal Ali
la source
1
Jack est obsolète depuis le 14 mars 2017
nhoxbypass
Ce lien décrit le processus de suppression de jackOptions. Ce n'est probablement pas la meilleure solution.
Anthony Naddeo
5

J'ai eu le même problème avec la dépendance greendao-générateur. J'ai ajouté par erreur cette dépendance dans mon build.gradle (compile 'org.greenrobot:greendao-generator:3.1.0' ) et AndroidStudio m'a montré le même message d'erreur.

C'est probablement parce que ce module a été compilé avec Java 8.

J'ai donc supprimé cette dépendance de mon build.gradle et tout s'est bien compilé :)

Riccardo Leschiutta
la source
2

J'ai résolu ce problème comme ci-dessous:

apply plugin: 'java'

sourceCompatibility = 1.7
targetCompatibility = 1.7

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}
李 歆 扬
la source
2

La désactivation d'Instant Run dans Android Studio 2.2 avec le plugin Gradle 2.2.2 l'a corrigé pour moi. Le retour à une version plus ancienne du plugin Gradle (telle que 2.2.0) l'a également corrigé, mais c'est moins souhaitable à mon humble avis.

StephanBezoen
la source
2

Cela m'est arrivé avec Android Studio 2.3.3. La solution que j'ai trouvée était de supprimer le dossier de construction, puis de reconstruire le projet . C'était aussi simple que ça.

mp501
la source
1

J'ai également rencontré la même erreur Android 2.3.3après avoir ajouté quelques dépendances JAR. Le problème était dû à la dépendance io.netty:netty-all:4.1.16.Final. Ce JAR version 4.1.16 a été compilé avec Java 1.8 et tous les autres ont été générés avec Java 1.7.

Cela est résolu, après avoir inclus une version plus ancienne de netty(qui a été générée avec Java 1.7) dans mon build.gradlefichier.

compile 'io.netty:netty-all:4.1.5.Final'

rashok
la source
Je suis venu ici avec le même problème, bien que netty page indique que java 1.6 est suffisant pour utiliser netty.
Tomasz Kryński
0

J'ai rencontré ce problème en essayant de passer à la valeur automatique v 1.5 dans Android Studio v 2.3.3. La valeur automatique 1.5 sera vraisemblablement compatible avec AS 3 (elle nécessite un compilateur java mis à jour)

Pour l'instant, la valeur automatique 1.4.1 fonctionne.

Aleksander Niedziolko
la source
0

J'ai rencontré ce problème en essayant d'importer un fichier jar compilé par jdk 1.8 dans Android Studio 3.0. J'ai essayé toutes les solutions ci-dessus, mais aucune ne fonctionne. donc, j'ai demandé au développeur de ce jar de le recompiler avec jdk 1.7, puis cela fonctionne bien, et ne rencontre plus ce problème.

oncle long
la source