it-swarm.com.de

Android: Dex kann den Byte-Code der Version 52 nicht analysieren

Ich habe gerade auf Android Studio 2.1 umgestellt und dieser Fehler wurde beim Kompilieren einer App angezeigt, die zuvor funktioniert hat:

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 Datei gradle.build des Hauptprojekts aktualisiert, um die Generierung von Java 1.7-Code 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 einzustellen:

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, das mit Maven gebaut wird. In der Datei pom.xml habe ich auch versucht, die Codegenerierung mit 1.7 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 dies ein Problem mit Android Studio 2.1? Haben es andere gesehen? 2) Angenommen, dies ist mein Fehler und da die Fehlermeldung keine Hilfe beim Finden des fehlerhaften Moduls gibt, gibt es Empfehlungen zum Finden des V52-Codes? Ich kann die Bibliotheken nicht einfach weglassen, ohne viel Code zu brechen. Kann man eine .jar-Datei überprüfen, um die Code-Revision zu finden? Vielen Dank im Voraus .- Hephaestus

89
Hephaestus

verwenden Sie einfach Java 1.8 mit Android Studio 3.0+ und legen Sie die folgenden Funktionen fest: 

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

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

Legen Sie es oben in die Datei build.gradle und bauen Sie es dann neu auf. 

    apply plugin: 'Java'
    apply plugin: 'jacoco'

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

        sourceCompatibility = 1.7
        targetCompatibility = 1.7
    }
16
nexDev

Wenn Sie org.jetbrains:annotation:15 und retrolambda plugin verwenden, entfernen Sie die Zeile compile org.jetbrains:annotations:15.0 aus Ihrem build.gradle. Der Fehler wird ausgeblendet. Für mich geht das.

8
0wl

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

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

oder füge dies in dependencies hinzu

    sourceCompatibility = 1.7
    targetCompatibility = 1.7

inalle Modulemanuell

7
vitalinvent

Ich konnte dieses Problem durch Hinzufügen der folgenden Zeilen lösen:

jackOptions {
    enabled true
}

auf defaultConfig in build.gradle-Datei.

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

7
Faisal Ali

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 angefügt haben.

Zum Beispiel: Ich hatte das gleiche Problem. Nach stundenlangem Suchen habe ich festgestellt, dass die Bibliothek org.codehaus.httpcache4j.uribuilder:2.0.0 Java 8 ab github erfordert. Wenn ich zu 1.1.0 gewechselt bin, wurde das Projekt erfolgreich erstellt und implementiert.

7
fobo66

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

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

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

5

Das Ausschalten von Instant Run in Android Studio 2.2 mit Gradle Plugin 2.2.2 hat es für mich behoben. Das Umschalten auf eine ältere Version des Gradle-Plugins (wie z. B. 2.2.0) wurde ebenfalls behoben. Dies ist jedoch weniger wünschenswert.

2
StephanBezoen

Ich habe dieses Problem wie folgt gelöst:

apply plugin: 'Java'

sourceCompatibility = 1.7
targetCompatibility = 1.7

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

Dies ist mir mit Android Studio 2.3.3 passiert. Die Lösung, die ich fand, bestand darin, den Build-Ordner zu löschen und dann Rebuild Project . So einfach war das.

2
mp501

Ich habe auch den gleichen Fehler in Android 2.3.3 festgestellt, nachdem ich einige JAR-Depots hinzugefügt hatte. Das Problem lag an der Deponie 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.

Dieses Problem wird behoben, nachdem ältere Version von netty (die mit Java 1.7 erstellt wurde) in meine build.gradle-Datei aufgenommen wurde. 

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

1
rashok

Ich bin auf dieses Problem gestoßen, als ich versuche, ein mit jdk 1.8 kompiliertes Glas in Android Studio 3.0 zu importieren. Ich habe alle oben genannten Lösungen ausprobiert, aber keine Arbeit. Also bat ich den Entwickler dieses Glases, es mit jdk 1.7 neu zu kompilieren, und dann funktioniert es gut.

0
uncle long

Wenn möglich für Sie:

  1. Aktualisieren Sie die Android-Tools auf: classpath 'com.Android.tools.build:gradle:3.0.0'
  2. buildToolsVersion "26.0.2"

Dies sollte sich um das Problem kümmern.

Referenz: https://developer.Android.com/studio/write/Java8-support

0
Kanika

Ich habe das gleiche Problem mit Reactive Location APIs Library für Android und RxJava 2 . Aktualisieren Sie build.gradle auf 3.0.1 und reduzieren Sie die Version der Reactive Location APIs Library für Android und RxJava 2 von 1.0. 4 bis 1.0.3Es funktioniert gut in meinem Fall.

0

Ich bin auf dieses Problem gestoßen, als ich versuche, in Android Studio 2.3.3 auf Auto-Value v 1.5 zu aktualisieren. Auto-value 1.5 wird vermutlich mit AS 3 kompatibel sein (erfordert einen aktualisierten Java-Compiler)

Im Moment funktioniert der Auto-Wert 1.4.1.