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

93

Я только что переключился на 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's 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, чтобы найти версию кода? Заранее спасибо. -Гефест

Гефест
источник
1
Я сейчас столкнулся с этой ошибкой. Удачи в решениях?
MetaSnarf
Я тоже обновил Android Studio до версии 2.1. С тех пор я столкнулся с этой проблемой. У тебя есть какое-нибудь решение?
Суреш Кумар
Более раннее сообщение об ошибке (которое с тех пор исчезло) предполагает, что файл jar pubnub был частью проблемы. Итак, мы закомментировали каждую ссылку на pubnub, и теперь он компилируется и запускается. Я считаю, что сообщение об ошибке исчезло, когда мы добавили директивы компилятора (показанные выше), чтобы принудительно установить код на «1.7», однако кажется, что часть кода 1.8 все еще просачивалась.
Гефест
Вот еще одно обсуждение SO: stackoverflow.com/questions/36968728/… . Но это не отвечает на вопрос, кроме как сказать «начните с более простого тестового проекта».
Гефест
1
Единственное, что мы сделали, - это вытащили библиотеку PubNub и заменили ее более старой версией. Казалось, это исправило. Но в этом случае мы протестировали, закомментировав импорт библиотеки и ее вызовы методов и определив, что это была ошибка. Но библиотека PubNub была слабо интегрирована, и мы могли довольно легко ее прокомментировать. Если бы у нас было много библиотек с тесной интеграцией, это было бы болезненно.
Гефест

Ответы:

89

просто используйте 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
    }
}
дурацкая клетка
источник
1
Спасибо. Однако я собираю SDK 19 и отмечаю, что у вас 23. Я думал, что Java 8 предназначена только для Android N. Я не думаю, что могу использовать Java 8 и при этом быть обратно совместимым с 19. Я ошибаюсь?
Гефест
3
Я скомпилировал код с java 8, ориентируясь на Android N, но без проблем запустил приложение на Android 16. Вы можете проверить это сами
Deepscorn
7
Видимо dexOptions.incremental больше не требуется , так как по умолчанию к истинному, см stackoverflow.com/questions/37522668
devconsole
1
Убедитесь, что вы понимаете ограничения использования java 8 и что не все языковые функции имеют обратную совместимость. developer.android.com/guide/platform/j8-jack.html
TrevJonez,
3
Обратите внимание: « android.dexOptions.incrementalСвойство устарело и не влияет на процесс сборки».
Jonik
16

Если у вас есть модуль с 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
    }
nexDev
источник
Круто. Спасибо. Я попробую.
Гефест
2
Это правильное решение, если у вас есть модуль с java-библиотекой, не специфичной для Android.
прославился
17
Ошибка: был применен плагин java, но он несовместим с плагинами Android.
Ален Сильджак
1
Согласовано. Плагин java явно несовместим с плагинами Android. Никакой радости.
Гефест
1
@Alen Siljak, примените плагин: «ваше имя плагина» не обязательно должно быть java.
nexDev 06
8

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

0wl
источник
7

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

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

fobo66
источник
fobo66: Да, согласен. Это в значительной степени то, что мы сделали. Я думаю, к сожалению, скоро все больше и больше библиотек будут скомпилированы с Java 8, и тогда это станет обычной проблемой. Это похоже на мир Python, где многие библиотеки все еще работают на версии 2.6.
Гефест
Возможно, вскоре мы, как и Python, обнаружим, что все библиотеки доступны отдельно в версиях J7 и J8.
Гефест
7

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

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

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

    sourceCompatibility = 1.7
    targetCompatibility = 1.7

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

vitalinvent
источник
7

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

jackOptions {
    enabled true
}

чтобы defaultConfigв build.gradleфайле.

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

Фейсал Али
источник
1
Поддержка
Эта ссылка описывает процесс удаления jackOptions. Наверное, это не лучшее решение.
Энтони Наддео
5

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

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

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

Риккардо Лешютта
источник
2

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

apply plugin: 'java'

sourceCompatibility = 1.7
targetCompatibility = 1.7

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}
李 歆 扬
источник
2

Отключение Instant Run в Android Studio 2.2 с плагином Gradle 2.2.2 исправило эту проблему. Возврат к более старой версии плагина Gradle (например, 2.2.0) также исправил это, но это менее желательно, imho.

СтефанБезоэн
источник
2

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

mp501
источник
1

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

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

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

рашок
источник
Пришел сюда с той же проблемой, хотя на странице netty указано, что java 1.6 достаточно для использования netty.
Tomasz Kryński
0

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

Пока работает авто-значение 1.4.1.

Александр Недзиолко
источник
0

Я столкнулся с этой проблемой при попытке импортировать банку, скомпилированную jdk 1.8 в Android Studio 3.0. Я пробовал все вышеперечисленные решения, но ни одно не помогло. Итак, я попросил разработчика этого jar-файла перекомпилировать его с помощью jdk 1.7, и тогда он работал хорошо, больше не сталкивался с этой проблемой.

дядя долго
источник