Android: Dex не может анализировать код байта версии 52

Я просто переключился на Android Studio 2.1, и эта ошибка появилась при попытке скомпилировать приложение, которое ранее работало:

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 build.gradle file.

Я уже обновил основной проект gradle.build для принудительного создания кода 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
    }
}

Я также обновил модуль gradle.build следующим образом, чтобы установить версию 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
}
}

Подмодуль строится с Maven. В файле pom.xml я также попытался заставить генерировать код 1.7.
Я понимаю, что я использую артефакт сборки, который включает подчиненные модули, но я не изменил ни одного из подчиненных модулей, и полученный .jar файл для модуля работал отлично в последний раз, когда я скомпилирован.

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

Мой вопрос: 1) Это проблема Android Studio 2.1? Другие видели? 2) Предполагая, что это моя ошибка, и поскольку сообщение об ошибке не помогает найти плохой модуль, есть ли какие-либо рекомендации по поиску кода V52? Я не могу просто опустить библиотеки, не нарушая большого количества кода. Можно ли проверить файл .jar, чтобы найти версию кода? Заранее спасибо. -Hephaestus

Ответ 1

просто используйте java 1.8 с Android Studio 3.0+ и задайте следующие работы для меня: кажется, нужны новейшие инструменты сборки

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

и

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

Ответ 2

Если у вас есть модуль с java-библиотекой, не привязанный к Android, это должно работать: apply plugin:'java'

Поместите его в начало файла build.gradle, а затем перестройте.

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

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

        sourceCompatibility = 1.7
        targetCompatibility = 1.7
    }

Ответ 3

Если вы используете org.jetbrains:annotation:15 и retrolambda плагин, тогда удалите строку compile org.jetbrains:annotations:15.0 из build.gradle, и ошибка исчезнет. Это работает для меня.

Ответ 4

Возможно, некоторые из ваших зависимостей были скомпилированы с Java 8, а не для Android. Попробуйте переключить эти зависимости на более раннюю версию. Я точно не знаю, какую библиотеку вы должны понизить, потому что вы не привязали список зависимостей вашего основного модуля.

Например: у меня была такая же проблема. После нескольких часов поиска я обнаружил, что для библиотеки org.codehaus.httpcache4j.uribuilder:2.0.0 требуется Java 8, начиная с github. Итак, когда я переключился на 1.1.0, проект был успешно создан и развернут.

Ответ 5

У меня была такая же проблема с зависимостью greendao-generator. Я ошибочно добавил, что зависимость от моего build.gradle(compile 'org.greenrobot:greendao-generator:3.1.0') и AndroidStudio показала мне то же сообщение об ошибке.

Возможно, это потому, что этот модуль был скомпилирован с Java 8.

Итак, я удалил эту зависимость из моего build.gradle и все скомпилировано счастливо:)

Ответ 6

Попробуйте добавить в main build.gradle в разделе allprojects

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

или добавить это в зависимости

    sourceCompatibility = 1.7
    targetCompatibility = 1.7

в все модули вручную

Ответ 7

Мне удалось решить эту проблему, добавив следующие строки:

jackOptions {
    enabled true
}

to defaultConfig в файле build.gradle.

Вы можете следовать рекомендациям для Java 8 по ссылке - https://developer.android.com/guide/platform/j8-jack.html

Ответ 8

Я решил эту проблему как ниже:

apply plugin: 'java'

sourceCompatibility = 1.7
targetCompatibility = 1.7

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

Ответ 9

Отключение Instant Run в Android Studio 2.2 с помощью Gradle плагина 2.2.2 исправлено для меня. Переход на более раннюю версию плагина Gradle (например, 2.2.0) также исправил его, но это менее желательно imho.

Ответ 10

Это случилось со мной с Android Studio 2.3.3. Решение, которое я нашел, это удалить папку сборки, а затем Перестроить проект. Это было так просто.

Ответ 11

Я также столкнулся с такой же ошибкой в ​​ Android 2.3.3, добавив несколько JAR-зависимостей. Проблема возникла из-за depenecy io.netty:netty-all:4.1.16.Final. Эта версия JAR 4.1.16 была скомпилирована с Java 1.8, а все остальные были сгенерированы с помощью Java 1.7.

Это будет разрешено после включения старой версии netty (которая была сгенерирована с помощью Java 1.7) в мой файл build.gradle.

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

Ответ 12

Я столкнулся с этой проблемой при попытке перейти на автоматическое значение v 1.5 в Android Studio v 2.3.3. Auto-value 1.5 предположительно будет совместим с AS 3 (для этого требуется обновленный java-компилятор)

В настоящее время работает автоматическое значение 1.4.1.