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
    }

Круто. Спасибо. Я попробую.
— Гефест

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и ошибка исчезнет. Меня устраивает.


7

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

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


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

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


7

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

jackOptions {
    enabled true
}

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

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



Эта ссылка описывает процесс удаления 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. Решение, которое я нашел, заключалось в том, чтобы удалить папку сборки, а затем перестроить проект . Это было так просто.


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, и тогда он работал хорошо, больше не сталкивался с этой проблемой.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.