Android: Dex no puede analizar la versión de código de 52 bytes

93

Acabo de cambiar a Android Studio 2.1 y apareció este error al intentar compilar una aplicación que funcionaba anteriormente:

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.

Ya había actualizado el archivo gradle.build del proyecto principal para forzar la generación de código 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
    }
}

También había actualizado el módulo gradle.build de la siguiente manera para configurar la versión 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
}
}

El submódulo que se está construyendo con Maven. En el archivo pom.xml también intenté forzar la generación de código 1.7.
Entiendo que estoy usando un artefacto de ensamblaje, que incorpora módulos subordinados, pero no he cambiado ninguno de los módulos subordinados y el archivo .jar resultante para el módulo funcionó bien la última vez que 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>

Mi pregunta: 1) ¿Es este un problema de Android Studio 2.1? ¿Lo han visto otros? 2) Suponiendo que este es mi error y dado que el mensaje de error no ayuda a encontrar el módulo defectuoso, ¿hay alguna recomendación para encontrar el código V52? No puedo simplemente omitir las bibliotecas sin romper una gran cantidad de código. ¿Se puede inspeccionar un archivo .jar para encontrar la revisión del código? Gracias por adelantado. -Hephaestus

Hefesto
fuente
1
Actualmente estoy enfrentando este error en este momento. ¿Alguna suerte con las soluciones?
MetaSnarf
Yo también actualicé Android Studio a 2.1. Desde entonces me enfrento a este problema. ¿Tienes alguna solución?
Suresh Kumar
Un mensaje de error anterior (que ha desaparecido desde entonces) sugiere que el archivo jar pubnub era parte del problema. Así que comentamos todas las referencias a pubnub y ahora se compila y se ejecuta. Creo que el mensaje de error desapareció cuando agregamos las directivas del compilador (que se muestran arriba) para forzar el código a "1.7", sin embargo, parece que parte del código 1.8 todavía se estaba filtrando.
Hefesto
Aquí hay otra discusión de SO que se relaciona: stackoverflow.com/questions/36968728/… . Pero lo que no responde a la pregunta, aparte de decir "comience con un proyecto de prueba más simple".
Hefesto
1
Lo único que hicimos fue sacar la biblioteca PubNub y reemplazarla con una versión anterior. Eso pareció arreglarlo. Pero en este caso, probamos comentando la importación de la biblioteca y sus llamadas a métodos y determinando que tenía la culpa. Pero la biblioteca PubNub estaba poco integrada y pudimos comentarla con bastante facilidad. Si tuviéramos muchas bibliotecas con una estrecha integración, sería doloroso.
Hefesto

Respuestas:

89

solo use java 1.8 con Android Studio 3.0+ y configure lo siguiente para mí: parece que necesita las últimas herramientas de compilación

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

y

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
    }
}
tonto
fuente
1
Gracias. Sin embargo, estoy construyendo para SDK 19 y noto que estás en 23. Pensé que Java 8 era solo para Android N. No creo que pueda usar Java 8 y seguir siendo compatible con versiones anteriores de 19. ¿Me equivoco?
Hefesto
3
Compilé código con java 8 mientras apuntaba a Android N, pero ejecuté la aplicación en Android 16 sin problemas. Puede probarlo usted mismo
Deepscorn
7
Aparentemente, dexOptions.incremental ya no es necesario ya que su valor predeterminado es verdadero, consulte stackoverflow.com/questions/37522668
devconsole
1
Asegúrese de comprender las limitaciones del uso de java 8 y de que no todas las funciones de idioma son compatibles con versiones anteriores. developer.android.com/guide/platform/j8-jack.html
TrevJonez
3
Tenga en cuenta que "La android.dexOptions.incrementalpropiedad está obsoleta y no tiene ningún efecto en el proceso de construcción".
Jonik
16

Si tiene un módulo con una biblioteca de Java que no es específica de Android , esto debería funcionar:apply plugin:'java'

Colóquelo en la parte superior del archivo build.gradle, luego reconstruya.

    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
fuente
Frio. Gracias. Lo probaré.
Hefesto
2
Esta es la solución adecuada si tiene un módulo con una biblioteca Java que no es específica de Android.
Gladed
17
Error: se aplicó el complemento 'java', pero no es compatible con los complementos de Android.
Alen Siljak
1
Convenido. El complemento 'java' aparentemente es incompatible con los complementos de Android. Sin alegría.
Hefesto
1
@Alen Siljak, aplique el complemento: 'el nombre de su complemento' no tiene que ser java.
nexDev
8

Si usa org.jetbrains:annotation:15un complemento retrolambda, elimine la línea compile org.jetbrains:annotations:15.0de su build.gradley el error desaparecerá. Esto funciona para mi.

0wl
fuente
7

Posiblemente, algunas de sus dependencias se compilaron con Java 8, no especialmente para Android. Intente cambiar esas dependencias a una versión anterior. No sé exactamente qué biblioteca debería degradar, porque no ha adjuntado una lista de dependencias de su módulo principal.

Por ejemplo: tuve el mismo problema. Después de horas de búsqueda, descubrí que la biblioteca org.codehaus.httpcache4j.uribuilder:2.0.0requiere Java 8, a partir de github . Entonces, cuando me cambié 1.1.0, el proyecto se construyó e implementó con éxito.

fobo66
fuente
fobo66: Sí, estoy de acuerdo. Esto es más o menos lo que hicimos. Creo que, desafortunadamente, pronto se compilarán más y más bibliotecas con Java 8 y esto será un problema común. Esto se parece al mundo de Python, donde muchas bibliotecas parecen estar todavía en 2.6.
Hefesto
Quizás pronto descubramos, como Python, que todas las bibliotecas están disponibles por separado como versiones J7 y J8.
Hefesto
7

Intente agregar a build.gradle principal en la sección allprojects

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

o agregue esto en dependencias

    sourceCompatibility = 1.7
    targetCompatibility = 1.7

en todos los módulos manualmente

invento vital
fuente
7

Pude resolver este problema agregando las siguientes líneas:

jackOptions {
    enabled true
}

a defaultConfigen el build.gradlearchivo.

Puede seguir las pautas para Java 8 en el enlace: https://developer.android.com/guide/platform/j8-jack.html

Faisal Ali
fuente
1
Jack está obsoleto desde el 14 de marzo de 2017
nhoxbypass
Ese enlace describe el proceso de eliminación de jackOptions. Probablemente esta no sea la mejor solución.
Anthony Naddeo
5

Tuve el mismo problema con la dependencia greendao-generator. Agregué por error esa dependencia en mi build.gradle ( compile 'org.greenrobot:greendao-generator:3.1.0') y AndroidStudio me mostró el mismo mensaje de error.

Probablemente sea porque ese módulo ha sido compilado con Java 8.

Así que eliminé esa dependencia de mi build.gradle y todo compilado felizmente :)

Riccardo Leschiutta
fuente
2

Resolví este problema de la siguiente manera:

apply plugin: 'java'

sourceCompatibility = 1.7
targetCompatibility = 1.7

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

Desactivar Instant Run en Android Studio 2.2 con el complemento Gradle 2.2.2 lo solucionó. Volver a una versión anterior del complemento de Gradle (como 2.2.0) también lo solucionó, pero eso es menos deseable en mi humilde opinión.

StephanBezoen
fuente
2

Esto me pasó con Android Studio 2.3.3. La solución que encontré fue eliminar la carpeta de compilación y luego Rebuild Project . Era tan simple como eso.

mp501
fuente
1

También enfrenté el mismo error en Android 2.3.3, después de agregar algunas dependencias JAR. El problema se debió a la dependencia io.netty:netty-all:4.1.16.Final. Este JAR versión 4.1.16 se compiló con Java 1.8 y todos los demás se generaron con Java 1.7.

Esto se resolvió, después de incluir una versión anterior de netty(que se generó con Java 1.7) en mi build.gradlearchivo.

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

rashok
fuente
Vine aquí con el mismo problema, aunque la página netty indica que java 1.6 es suficiente para usar netty.
Tomasz Kryński
0

Me he encontrado con este problema al intentar actualizar al valor automático v 1.5 en Android Studio v 2.3.3. El valor automático 1.5 probablemente será compatible con AS 3 (requiere un compilador java actualizado)

Por ahora, el valor automático 1.4.1 funciona.

Aleksander Niedziolko
fuente
0

Me he encontrado con este problema al intentar importar un archivo jar compilado por jdk 1.8 en Android Studio 3.0. Intenté todas las soluciones anteriores, pero ninguna funciona. Entonces, le pedí al desarrollador de ese jar que lo recompilara con jdk 1.7, y luego funcionó bien, no volver a encontrar este problema.

tío largo
fuente