Android: Dex kann den Bytecode der Version 52 nicht analysieren

93

Ich habe gerade zu Android Studio 2.1 gewechselt und dieser Fehler trat auf, als ich versuchte, eine App zu kompilieren, die zuvor funktionierte:

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.

Ich hatte bereits die gradle.build-Datei des Hauptprojekts aktualisiert, um die Java 1.7-Codegenerierung zu erzwingen:

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

Ich hatte auch das Modul gradle.build wie folgt aktualisiert, um die Java-Version festzulegen:

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
}
}

Das Submodul wird mit Maven gebaut. In der Datei pom.xml habe ich auch versucht, die 1.7-Codegenerierung zu erzwingen.
Ich verstehe, dass ich ein Assembly-Artefakt verwende, das untergeordnete Module enthält, aber ich habe keines der untergeordneten Module geändert, und die resultierende JAR-Datei für das Modul lief beim letzten Kompilieren einwandfrei.

    <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>

Meine Frage: 1) Ist das ein Android Studio 2.1 Problem? Haben andere es gesehen? 2) Angenommen, dies ist mein Fehler, und da die Fehlermeldung beim Auffinden des fehlerhaften Moduls keine Hilfe bietet, gibt es Empfehlungen zum Auffinden des V52-Codes? Ich kann die Bibliotheken nicht einfach weglassen, ohne viel Code zu beschädigen. Kann man eine JAR-Datei untersuchen, um die Code-Revision zu finden? Danke im Voraus. -Hephaestus

Hephaistos
quelle
1
Ich bin gerade mit diesem Fehler konfrontiert. Glück für Lösungen?
MetaSnarf
Auch ich habe Android Studio auf 2.1 aktualisiert. Seitdem stehe ich vor diesem Problem. Hast du eine Lösung?
Suresh Kumar
Eine frühere Fehlermeldung (die inzwischen verschwunden ist) deutet darauf hin, dass die pubnub-JAR-Datei Teil des Problems war. Also haben wir jeden Verweis auf pubnub auskommentiert und er wird jetzt kompiliert und ausgeführt. Ich glaube, die Fehlermeldung ist verschwunden, als wir die Compiler-Direktiven (siehe oben) hinzugefügt haben, um den Code auf "1.7" zu zwingen. Es scheint jedoch, dass ein Teil des 1.8-Codes immer noch durchgesickert ist.
Hephaistos
Hier ist eine weitere SO-Diskussion, die sich darauf bezieht: stackoverflow.com/questions/36968728/… . Aber was die Frage nicht beantwortet, außer zu sagen "Beginnen Sie mit einem einfacheren Testprojekt".
Hephaistos
1
Das einzige, was wir getan haben, war, die PubNub-Bibliothek herauszuziehen und durch eine ältere Version zu ersetzen. Das schien es zu beheben. In diesem Fall haben wir den Bibliotheksimport und seine Methodenaufrufe auskommentiert und festgestellt, dass ein Fehler vorliegt. Aber die PubNub-Bibliothek war lose integriert und wir konnten es ziemlich einfach auskommentieren. Wenn wir viele Bibliotheken mit enger Integration hätten, wäre das schmerzhaft.
Hephaistos

Antworten:

89

Verwenden Sie einfach Java 1.8 mit Android Studio 3.0+ und stellen Sie folgende Funktionen für mich ein: Es scheint, dass Sie die neuesten Build-Tools benötigen

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

und

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
    }
}
Dummkopf
quelle
1
Danke dir. Ich baue jedoch auf SDK 19 auf und stelle fest, dass Sie auf 23 sind. Ich dachte, Java 8 sei nur für Android N. Ich glaube nicht, dass ich Java 8 verwenden kann und trotzdem abwärtskompatibel mit 19 bin. Bin ich falsch?
Hephaistos
3
Ich habe Code mit Java 8 kompiliert, während ich auf Android N abzielte, aber die App auf Android 16 ohne Probleme ausgeführt. Sie können es selbst testen
Deepscorn
7
Anscheinend ist dexOptions.incremental nicht mehr erforderlich, da es standardmäßig true ist, siehe stackoverflow.com/questions/37522668
devconsole
1
Bitte stellen Sie sicher, dass Sie die Einschränkungen der Verwendung von Java 8 verstehen und dass nicht alle Sprachfunktionen abwärtskompatibel sind. developer.android.com/guide/platform/j8-jack.html
TrevJonez
3
Beachten Sie, dass "Die android.dexOptions.incrementalEigenschaft veraltet ist und keine Auswirkungen auf den Erstellungsprozess hat."
Jonik
16

Wenn Sie ein Modul mit einer Java-Bibliothek haben, die nicht Android-spezifisch ist , sollte dies funktionieren:apply plugin:'java'

Fügen Sie es oben in die Datei build.gradle ein und erstellen Sie es neu.

    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
quelle
Cool. Vielen Dank. Ich werde es versuchen.
Hephaistos
2
Dies ist die richtige Lösung, wenn Sie ein Modul mit einer Java-Bibliothek haben, die nicht Android-spezifisch ist.
froh
17
Fehler: Das 'Java'-Plugin wurde angewendet, ist jedoch nicht mit den Android-Plugins kompatibel.
Alen Siljak
1
Einverstanden. Das 'Java'-Plugin ist anscheinend nicht mit Android-Plugins kompatibel. Keine Freude.
Hephaistos
1
@Alen Siljak, Plugin anwenden: 'Dein Plugin-Name' muss nicht Java sein.
NexDev
8

Wenn Sie ein org.jetbrains:annotation:15Retrolambda-Plugin verwenden, entfernen Sie die Leitung compile org.jetbrains:annotations:15.0von Ihrem build.gradleund der Fehler verschwindet. Für mich geht das.

0wl
quelle
7

Möglicherweise wurden einige Ihrer Abhängigkeiten mit Java 8 kompiliert, nicht speziell für Android. Versuchen Sie, diese Abhängigkeiten auf eine ältere Version umzustellen. Ich weiß nicht genau, welche Bibliothek Sie downgraden sollten, da Sie keine Liste der Abhängigkeiten Ihres Hauptmoduls angehängt haben.

Zum Beispiel: Ich hatte das gleiche Problem. Nach stundenlangem Suchen habe ich festgestellt, dass für die Bibliothek ab Githuborg.codehaus.httpcache4j.uribuilder:2.0.0 Java 8 erforderlich ist . Wenn ich zu gewechselt bin, 1.1.0wurde das Projekt erfolgreich erstellt und bereitgestellt.

fobo66
quelle
fobo66: Ja, ich stimme zu. Das haben wir so ziemlich getan. Ich denke, leider werden bald immer mehr Bibliotheken mit Java 8 kompiliert und dies wird dann ein häufiges Problem sein. Dies scheint genau wie in der Welt von Python, in der viele Bibliotheken noch auf 2.6 zu sein scheinen.
Hephaistos
Vielleicht werden wir bald wie Python feststellen, dass alle Bibliotheken separat als J7- und J8-Version verfügbar sind.
Hephaistos
7

Versuchen Sie, im Abschnitt allprojects zu main build.gradle hinzuzufügen

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

oder fügen Sie dies in Abhängigkeiten hinzu

    sourceCompatibility = 1.7
    targetCompatibility = 1.7

in allen Modulen manuell

vitalinvent
quelle
7

Ich konnte dieses Problem lösen, indem ich die folgenden Zeilen hinzufügte:

jackOptions {
    enabled true
}

um defaultConfigin build.gradleDatei.

Sie können den Richtlinien für Java 8 unter dem Link https://developer.android.com/guide/platform/j8-jack.html folgen

Faisal Ali
quelle
1
Jack ist seit dem 14. März 2017
nhoxbypass
Dieser Link beschreibt den Vorgang des Entfernens von jackOptions. Dies ist wahrscheinlich nicht die beste Lösung.
Anthony Naddeo
5

Ich hatte das gleiche Problem mit der Abhängigkeit vom Greendao-Generator. Ich habe diese Abhängigkeit fälschlicherweise in mein build.gradle (compile 'org.greenrobot:greendao-generator:3.1.0' ) und AndroidStudio mir dieselbe Fehlermeldung .

Wahrscheinlich liegt es daran, dass dieses Modul mit Java 8 kompiliert wurde.

Also habe ich diese Abhängigkeit von meinem build.gradle entfernt und alles glücklich kompiliert :)

Riccardo Leschiutta
quelle
2

Ich habe dieses Problem wie folgt gelöst:

apply plugin: 'java'

sourceCompatibility = 1.7
targetCompatibility = 1.7

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

Das Ausschalten von Instant Run in Android Studio 2.2 mit dem Gradle-Plugin 2.2.2 hat es für mich behoben. Das Zurückschalten auf eine ältere Version des Gradle-Plugins (wie 2.2.0) hat das Problem ebenfalls behoben, aber das ist imho weniger wünschenswert.

StephanBezoen
quelle
2

Dies ist mir mit Android Studio 2.3.3 passiert. Die Lösung, die ich gefunden habe, bestand darin, den Build-Ordner zu löschen und dann das Projekt neu zu erstellen . So einfach war das.

mp501
quelle
1

Ich hatte auch den gleichen Fehler Android 2.3.3, nachdem ich einige JAR-Abhängigkeiten hinzugefügt hatte. Das Problem war auf die Abhängigkeit zurückzuführen io.netty:netty-all:4.1.16.Final. Diese JAR-Version 4.1.16 wurde mit Java 1.8 kompiliert und alle anderen wurden mit Java 1.7 generiert.

Dies wird behoben, nachdem eine ältere Version von netty(die mit Java 1.7 generiert wurde) in meine build.gradleDatei aufgenommen wurde.

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

Rashok
quelle
Kam hier mit dem gleichen Problem, obwohl Netty Page angibt, dass Java 1.6 ausreicht, um Netty zu verwenden.
Tomasz Kryński
0

Ich bin auf dieses Problem gestoßen, als ich versucht habe, ein Upgrade auf Auto-Value Version 1.5 in Android Studio Version 2.3.3 durchzuführen. Auto-Value 1.5 ist vermutlich mit AS 3 kompatibel (es ist ein aktualisierter Java-Compiler erforderlich).

Im Moment funktioniert der Auto-Wert 1.4.1.

Aleksander Niedziolko
quelle
0

Ich bin auf dieses Problem gestoßen, als ich versuchte, ein von jdk 1.8 kompiliertes JAR in Android Studio 3.0 zu importieren. Ich habe alle oben genannten Lösungen ausprobiert, aber keine funktionieren. Also habe ich den Entwickler dieses JAR gebeten, es mit jdk 1.7 neu zu kompilieren, und dann funktioniert es gut, ohne dass dieses Problem erneut auftritt.

Onkel lang
quelle