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


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

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
    }

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.


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



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


2

Resolvi este problema da seguinte forma:

apply plugin: 'java'

sourceCompatibility = 1.7
targetCompatibility = 1.7

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

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.


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.


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'


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.



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.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.