Android: Dex não consegue analisar o código de bytes da versão 52

93

Acabei de mudar para o Android Studio 2.1 e este erro apareceu ao tentar compilar um aplicativo que estava funcionando 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.

Eu já havia atualizado o arquivo gradle.build do projeto principal para forçar a geração do 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
    }
}

Eu também atualizei o módulo gradle.build da seguinte maneira para definir a versão 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
}
}

O submódulo sendo construído com Maven. No arquivo pom.xml, também tentei forçar a geração de código 1.7.
Eu entendo que estou usando um artefato de montagem, que incorpora módulos subordinados, mas não alterei nenhum dos módulos subordinados e o arquivo .jar resultante para o módulo funcionou bem da última vez que compilei.

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

Minha pergunta: 1) Este é um problema do Android Studio 2.1? Outros viram? 2) Presumindo que este seja meu erro e uma vez que a mensagem de erro não ajuda a encontrar o módulo defeituoso, há alguma recomendação sobre como encontrar o código V52? Não posso simplesmente omitir as bibliotecas sem quebrar uma grande quantidade de código. É possível inspecionar um arquivo .jar para encontrar a revisão do código? Desde já, obrigado. -Hefesto

Hefesto
fonte
1
No momento, estou enfrentando esse erro agora. Alguma sorte para soluções?
MetaSnarf
Eu também atualizei o Android Studio para 2.1. Desde então estou enfrentando esse problema. Você conseguiu alguma solução?
Suresh Kumar
Uma mensagem de erro anterior (que desapareceu desde então) sugere que o arquivo jar pubnub era parte do problema. Então comentamos todas as referências ao pubnub e agora ele compila e executa. Acredito que a mensagem de erro foi embora quando adicionamos as diretivas do compilador (mostradas acima) para forçar o código para "1.7", no entanto, parece que parte do código 1.8 ainda estava vazando.
Hefesto
Aqui está outra discussão do SO relacionada: stackoverflow.com/questions/36968728/… . Mas isso não responde à pergunta, a não ser dizer "comece com um projeto de teste mais simples".
Hefesto
1
A única coisa que fizemos foi retirar a biblioteca PubNub e substituí-la por uma versão mais antiga. Isso pareceu consertar tudo. Mas, neste caso, testamos comentando a importação da biblioteca e suas chamadas de método e determinando que era a falha. Mas a biblioteca PubNub estava vagamente integrada e poderíamos comentá-la com bastante facilidade. Se tivéssemos muitas bibliotecas com integração total, seria doloroso.
Hefesto

Respostas:

89

basta usar java 1.8 com Android Studio 3.0+ e definir o seguinte funciona para mim: parece que preciso das ferramentas de compilação mais recentes

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
    }
}
gaiola
fonte
1
Obrigado. No entanto, estou compilando para o SDK 19 e observo que você está no 23. Pensei que Java 8 era apenas para Android N. Não acho que posso usar Java 8 e ainda ser compatível com versões anteriores de 19. Estou incorreto?
Hefesto
3
Compilei o código com java 8 visando o Android N, mas executei o aplicativo no Android 16 sem problemas. Você pode testar você mesmo
Deepscorn de
7
Aparentemente, dexOptions.incremental não é mais necessário, pois o padrão é verdadeiro, consulte stackoverflow.com/questions/37522668
devconsole
1
Certifique-se de compreender as limitações de uso do java 8 e de que nem todos os recursos de linguagem são compatíveis com versões anteriores. developer.android.com/guide/platform/j8-jack.html
TrevJonez
3
Observe que "A android.dexOptions.incrementalpropriedade está obsoleta e não tem efeito no processo de construção."
Jonik
16

Se você tiver um módulo com uma biblioteca java que não seja específica do Android , isso deve funcionar:apply plugin:'java'

Coloque-o no início do arquivo build.gradle e recompile.

    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
fonte
Legal. Obrigado. Vou dar uma chance.
Hefesto
2
Esta é a solução certa se você tiver um módulo com uma biblioteca java que não seja específica do Android.
feliz em
17
Erro: o plug-in 'java' foi aplicado, mas não é compatível com os plug-ins do Android.
Alen Siljak
1
Acordado. O plugin 'java' é aparentemente incompatível com os plug-ins do Android. Sem alegria.
Hefesto
1
@Alen Siljak, aplique o plugin: 'nome do seu plugin' não precisa ser java.
nexDev
8

Se você usar org.jetbrains:annotation:15um plugin retrolambda, remova a linha compile org.jetbrains:annotations:15.0do seu build.gradlee o erro desaparecerá. Funciona para mim.

0wl
fonte
7

Possivelmente, algumas de suas dependências foram compiladas com Java 8, não especialmente para Android. Tente mudar essas dependências para uma versão mais antiga. Não sei exatamente qual biblioteca você deve fazer o downgrade, porque você não anexou uma lista de dependências do seu módulo principal.

Por exemplo: tive o mesmo problema. Depois de horas de pesquisa, descobri que a biblioteca org.codehaus.httpcache4j.uribuilder:2.0.0requer Java 8, a partir do github . Então, quando mudei para 1.1.0, o projeto foi construído e implantado com sucesso.

fobo66
fonte
fobo66: Sim, concordo. Isso é basicamente o que fizemos. Acho que, infelizmente, mais e mais bibliotecas serão compiladas em breve com Java 8 e isso será um problema comum. Isso se parece com o mundo do Python, onde muitas bibliotecas parecem ainda estar no 2.6.
Hefesto
Talvez descubramos em breve, como o Python, que todas as bibliotecas estão disponíveis separadamente nas versões J7 e J8.
Hefesto
7

Tente adicionar ao build.gradle principal na seção allprojects

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

ou adicione isso nas dependências

    sourceCompatibility = 1.7
    targetCompatibility = 1.7

em todos os módulos manualmente

vitalinvent
fonte
7

Consegui resolver esse problema adicionando as seguintes linhas:

jackOptions {
    enabled true
}

para defaultConfigno build.gradlearquivo.

Você pode seguir as diretrizes para Java 8 no link - https://developer.android.com/guide/platform/j8-jack.html

Faisal Ali
fonte
1
Jack está obsoleto desde 14 de março de 2017
nhoxbypass
Esse link descreve o processo de remoção de jackOptions. Esta provavelmente não é a melhor solução.
Anthony Naddeo
5

Eu tive o mesmo problema com a dependência greendao-gerador. Eu adicionei por engano essa dependência em meu build.gradle ( compile 'org.greenrobot:greendao-generator:3.1.0') e o AndroidStudio me mostrou a mesma mensagem de erro.

Provavelmente porque esse módulo foi compilado com Java 8.

Então, eu removi essa dependência do meu build.gradle e tudo compilou alegremente :)

Riccardo Leschiutta
fonte
2

Resolvi este problema da seguinte forma:

apply plugin: 'java'

sourceCompatibility = 1.7
targetCompatibility = 1.7

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

Desativar o Instant Run no Android Studio 2.2 com o plug-in Gradle 2.2.2 corrigiu isso para mim. Voltar para uma versão mais antiga do plug-in Gradle (como 2.2.0) também corrigiu, mas isso é menos desejável na hora.

StephanBezoen
fonte
2

Isso aconteceu comigo com o Android Studio 2.3.3. A solução que encontrei foi excluir a pasta de construção e, em seguida, Rebuild Project . Era tão simples quanto isso.

mp501
fonte
1

Eu também encontrei o mesmo erro Android 2.3.3, depois de adicionar algumas dependências JAR. O problema era devido ao dependência io.netty:netty-all:4.1.16.Final. Este JAR versão 4.1.16 foi compilado com Java 1.8 e todos os outros foram gerados com Java 1.7.

Isso foi resolvido, após incluir a versão mais antiga do netty(que foi gerada com Java 1.7) em meu build.gradlearquivo.

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

Rashok
fonte
Vim aqui com o mesmo problema, embora a página netty esteja afirmando que java 1.6 é suficiente para usar netty.
Tomasz Kryński
0

Eu me deparei com esse problema ao tentar atualizar para o valor automático v 1.5 no Android Studio v 2.3.3. O valor automático 1.5 provavelmente será compatível com AS 3 (requer um compilador java atualizado)

Por enquanto, o valor automático 1.4.1 funciona.

Aleksander Niedziolko
fonte
0

Eu me deparei com esse problema ao tentar importar um jar compilado por jdk 1.8 no Android Studio 3.0. Tentei todas as soluções acima, mas nenhuma funcionou. então, pedi ao desenvolvedor desse jar para recompilá-lo com o jdk 1.7, e então funcionou bem, não encontrando esse problema novamente.

tio longo
fonte