Android: Dex non può analizzare il codice della versione a 52 byte


93

Sono appena passato ad Android Studio 2.1 e questo errore si è verificato durante il tentativo di compilare un'app che in precedenza funzionava:

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.

Avevo già aggiornato il file gradle.build del progetto principale per forzare la generazione di codice 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
    }
}

Avevo anche aggiornato il modulo gradle.build come segue per impostare la versione 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
}
}

Il sottomodulo in costruzione con Maven. Nel file pom.xml ho anche provato a forzare la generazione del codice 1.7.
Capisco che sto usando un artefatto di assemblaggio, che incorpora moduli subordinati, ma non ho modificato nessuno dei moduli subordinati e il file .jar risultante per il modulo ha funzionato bene l'ultima volta che ho compilato.

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

La mia domanda: 1) è un problema di Android Studio 2.1? L'hanno visto altri? 2) Supponendo che questo sia il mio errore e poiché il messaggio di errore non aiuta a trovare il modulo danneggiato, ci sono consigli per trovare il codice V52? Non posso semplicemente omettere le librerie senza rompere una grande quantità di codice. Si può esaminare un file .jar per trovare la revisione del codice? Grazie in anticipo. -Efesto


1
Attualmente sto affrontando questo errore in questo momento. Qualche fortuna per le soluzioni?
MetaSnarf

Anch'io ho aggiornato Android Studio alla 2.1. Da allora sto affrontando questo problema. Hai una soluzione?
Suresh Kumar

Un messaggio di errore precedente (che da allora è scomparso) suggerisce che il file jar pubnub faceva parte del problema. Quindi abbiamo commentato ogni riferimento a pubnub e ora viene compilato ed eseguito. Credo che il messaggio di errore sia sparito quando abbiamo aggiunto le direttive del compilatore (mostrate sopra) per forzare il codice a "1.7", tuttavia sembra che parte del codice 1.8 stesse ancora trapelando.
Efesto

Ecco un'altra discussione SO che riguarda: stackoverflow.com/questions/36968728/… . Ma che non risponde alla domanda, tranne che per dire "inizia con un progetto di test più semplice".
Efesto

1
L'unica cosa che abbiamo fatto è stata estrarre la libreria PubNub e sostituirla con una versione precedente. Questo sembrava risolverlo. Ma in questo caso, abbiamo testato commentando l'importazione della libreria e le sue chiamate al metodo e determinando che fosse colpa. Ma la libreria PubNub era poco integrata e potevamo commentarla abbastanza facilmente. Se avessimo molte librerie con una stretta integrazione, sarebbe doloroso.
Efesto

Risposte:


89

basta usare java 1.8 con Android Studio 3.0+ e impostare i seguenti lavori per me: sembra aver bisogno degli ultimi strumenti di build

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

e

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
Grazie. Tuttavia, sto costruendo su SDK 19 e noto che sei su 23. Pensavo che Java 8 fosse solo per Android N. Non credo di poter usare Java 8 ed essere ancora compatibile con le versioni precedenti di 19. Non sono corretto?
Efesto

3
Ho compilato il codice con java 8 mentre miravo ad Android N, ma ho eseguito l'app su Android 16 senza problemi. Puoi testarlo tu stesso
Deepscorn

7
A quanto pare dexOptions.incremental non è più necessaria dal momento che il valore predefinito è vero, vedere stackoverflow.com/questions/37522668
devconsole

1
Assicurati di comprendere i limiti dell'utilizzo di java 8 e che non tutte le funzionalità della lingua sono compatibili con le versioni precedenti. developer.android.com/guide/platform/j8-jack.html
TrevJonez

3
Notare che "La android.dexOptions.incrementalproprietà è obsoleta e non ha alcun effetto sul processo di compilazione".
Jonik

16

Se hai un modulo con una libreria java che non è specifica per Android , dovrebbe funzionare:apply plugin:'java'

Mettilo all'inizio del file build.gradle, quindi ricostruiscilo.

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

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

        sourceCompatibility = 1.7
        targetCompatibility = 1.7
    }

Freddo. Grazie. Lo proverò.
Efesto

2
Questa è la soluzione giusta se hai un modulo con una libreria java che non è specifica per Android.
rallegrato il

17
Errore: il plug-in "java" è stato applicato, ma non è compatibile con i plug-in Android.
Alen Siljak

1
Concordato. Il plug-in "java" è apparentemente incompatibile con i plug-in Android. Nessuna gioia.
Efesto

1
@ Alen Siljak, applica il plugin: 'il nome del tuo plugin' non deve essere java.
nexDev

8

Se usi org.jetbrains:annotation:15e retrolambda plugin, rimuovi la riga compile org.jetbrains:annotations:15.0dal tuo build.gradlee l'errore scomparirà. Per me funziona.


7

Forse, alcune delle tue dipendenze sono state compilate con Java 8, non soprattutto per Android. Prova a cambiare le dipendenze alla versione precedente. Non so esattamente quale libreria dovresti eseguire il downgrade, perché non hai allegato un elenco di dipendenze del tuo modulo principale.

Ad esempio: ho avuto lo stesso problema. Dopo ore di ricerca, ho scoperto che la libreria org.codehaus.httpcache4j.uribuilder:2.0.0richiede Java 8, a partire da GitHub . Quindi, quando sono passato a 1.1.0, il progetto è stato creato e distribuito con successo.


fobo66: Sì, sono d'accordo. Questo è più o meno quello che abbiamo fatto. Penso, sfortunatamente, che presto verranno compilate sempre più librerie con Java 8 e questo sarà quindi un problema comune. Questo sembra proprio come il mondo di Python in cui molte librerie sembrano essere ancora in 2.6.
Efesto

Forse scopriremo presto, come Python, che tutte le librerie sono disponibili separatamente come versioni J7 e J8.
Efesto

7

Prova ad aggiungere a build.gradle principale nella sezione allprojects

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

o aggiungilo nelle dipendenze

    sourceCompatibility = 1.7
    targetCompatibility = 1.7

in tutti i moduli manualmente



5

Ho avuto lo stesso problema con la dipendenza dal generatore di greendao. Ho erroneamente aggiunto quella dipendenza nel mio build.gradle ( compile 'org.greenrobot:greendao-generator:3.1.0') e AndroidStudio mi ha mostrato lo stesso messaggio di errore.

Probabilmente è perché quel modulo è stato compilato con Java 8.

Quindi ho rimosso quella dipendenza dal mio build.gradle e tutto compilato felicemente :)


2

Ho risolto questo problema come di seguito:

apply plugin: 'java'

sourceCompatibility = 1.7
targetCompatibility = 1.7

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

2

La disattivazione di Instant Run in Android Studio 2.2 con il plug-in Gradle 2.2.2 ha risolto il problema per me. Anche il ritorno a una versione precedente del plug-in Gradle (come 2.2.0) lo ha risolto, ma è meno desiderabile imho.


2

Questo è successo a me con Android Studio 2.3.3. La soluzione che ho trovato è stata eliminare la cartella build e quindi Rebuild Project . Era così semplice.


1

Ho anche Android 2.3.3riscontrato lo stesso errore dopo aver aggiunto alcune dipendenze JAR. Il problema era dovuto alla depenecy io.netty:netty-all:4.1.16.Final. Questo JAR versione 4.1.16 è stato compilato con Java 1.8 e tutti gli altri sono stati generati con Java 1.7.

Questo viene risolto, dopo aver incluso la versione precedente di netty(che è stata generata con Java 1.7) nel mio build.gradlefile.

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


È venuto qui con lo stesso problema, sebbene netty page affermi che java 1.6 è sufficiente per usare netty.
Tomasz Kryński

0

Ho riscontrato questo problema durante il tentativo di aggiornamento al valore automatico v 1.5 in Android Studio v 2.3.3. Il valore automatico 1.5 sarà presumibilmente compatibile con AS 3 (richiede un compilatore java aggiornato)

Per ora il valore automatico 1.4.1 funziona.



0

Ho riscontrato questo problema durante il tentativo di importare un jar compilato da jdk 1.8 in Android Studio 3.0. Ho provato tutte le soluzioni precedenti, ma nessuna funziona. quindi, ho chiesto allo sviluppatore di quel jar di ricompilarlo con jdk 1.7, e poi funziona bene, senza incontrare di nuovo questo problema.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.