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

Підмодуль будується разом з Мейвен. У файлі 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. Відтоді я стикаюся з цією проблемою. Ви отримали якесь рішення?
Суреш Кумар

Попереднє повідомлення про помилку (яке з тих пір відійшло) говорить про те, що файл jarn pub jar був частиною проблеми. Тому ми прокоментували кожне посилання на 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.
Alen Siljak

1
Домовились. Плагін "java", мабуть, несумісний із плагінами Android. Ніякої радості.
Гефест

1
@Alen Siljak, застосувати плагін: "ваше ім'я плагіна" не повинно бути java.
nexDev

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

Спробуйте додати до main build.gradle у розділі всіпроекти

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


1
Джек
застаряє

Це посилання описує процес видалення jackOptions. Це, мабуть, не найкраще рішення.
Ентоні Наддео

5

У мене була така ж проблема із залежністю від гріндао-генератора. Я помилково додав, що залежність у моїй 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

Вимкнення миттєвого запуску в Android Studio 2.2 за допомогою плагіна Gradle 2.2.2 виправило це для мене. Перехід на старішу версію плагіна Gradle (наприклад, 2.2.0) також виправив, але це менш бажано.


2

Це сталося зі мною з Android Studio 2.3.3. Я знайшов рішення - видалити папку збірки, а потім відновити проект . Це було так просто.


1

Я також зіткнувся з такою ж помилкою Android 2.3.3, додавши кілька покарань JAR. Проблема була через залежність io.netty:netty-all:4.1.16.Final. Ця версія 4.1.16 JAR була складена з 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.
Томаш Кринський

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. Я спробував усе вищезазначене рішення, але нічого не вийшло. тож я попросив розробника цього банку перекомпілювати його з jdk 1.7, а потім він спрацює добре, не натрапляючи на цю проблему знову.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.