Android: Dex tidak dapat mengurai kode versi 52 byte

93

Saya baru saja beralih ke Android Studio 2.1 dan kesalahan ini muncul ketika mencoba mengompilasi aplikasi yang sebelumnya berfungsi:

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.

Saya telah memperbarui file gradle.build proyek utama untuk memaksa pembuatan kode 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
    }
}

Saya juga telah memperbarui modul gradle.build sebagai berikut untuk mengatur versi 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
}
}

Submodul sedang dibangun dengan Maven. Dalam file pom.xml saya juga mencoba memaksa pembuatan kode 1,7.
Saya memahami bahwa saya menggunakan artefak perakitan, yang menggabungkan modul bawahan, tetapi saya tidak mengubah salah satu modul bawahan dan file .jar yang dihasilkan untuk modul berjalan dengan baik terakhir kali saya menyusunnya.

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

Pertanyaan saya: 1) Apakah ini masalah Android Studio 2.1? Pernahkah orang lain melihatnya? 2) Dengan asumsi ini adalah kesalahan saya dan karena pesan kesalahan tidak memberikan bantuan dalam menemukan modul yang buruk, apakah ada rekomendasi untuk menemukan kode V52? Saya tidak bisa begitu saja menghilangkan pustaka tanpa merusak sejumlah besar kode. Bisakah seseorang memeriksa file .jar untuk menemukan revisi kode? Terima kasih sebelumnya. -Hephaestus

Hephaestus
sumber
1
Saya sedang menghadapi kesalahan ini sekarang. Beruntung ada solusi?
MetaSnarf
Saya juga memperbarui Android Studio ke 2.1. Sejak itu saya menghadapi masalah ini. Apakah Anda punya solusi?
Suresh Kumar
Pesan kesalahan sebelumnya (yang telah hilang) menunjukkan bahwa file jar pubnub adalah bagian dari masalah. Jadi kami mengomentari setiap referensi ke pubnub dan sekarang dikompilasi dan dijalankan. Saya yakin pesan kesalahan hilang ketika kami menambahkan arahan kompiler (ditampilkan di atas) untuk memaksa kode ke "1.7", namun tampaknya beberapa kode 1.8 masih bocor.
Hephaestus
Berikut adalah diskusi SO lain yang terkait: stackoverflow.com/questions/36968728/… . Tapi yang tidak menjawab pertanyaan, selain mengatakan "mulai dengan proyek uji yang lebih sederhana".
Hephaestus
1
Satu-satunya hal yang kami lakukan adalah mencabut perpustakaan PubNub dan mengganti dengan versi yang lebih lama. Itu sepertinya memperbaikinya. Namun dalam kasus ini, kami menguji dengan mengomentari impor perpustakaan dan pemanggilan metodenya dan menentukan bahwa itu salah. Tetapi perpustakaan PubNub terintegrasi secara longgar dan kami dapat berkomentar dengan mudah. Jika kami memiliki banyak perpustakaan dengan integrasi yang erat, itu akan menyakitkan.
Hephaestus

Jawaban:

89

cukup gunakan java 1.8 dengan Android Studio 3.0+ dan setel yang berikut ini berfungsi untuk saya: sepertinya perlu alat versi terbaru

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

dan

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
    }
}
kebodohan
sumber
1
Terima kasih. Namun, saya membangun ke SDK 19 dan saya perhatikan bahwa Anda menggunakan 23. Saya pikir Java 8 hanya untuk Android N. Saya tidak berpikir bahwa saya dapat menggunakan Java 8 dan masih kompatibel dengan versi 19. Apakah saya salah?
Hephaestus
3
Saya menyusun kode dengan java 8 sambil menargetkan Android N, tetapi menjalankan aplikasi di Android 16 tanpa masalah. Anda dapat mengujinya sendiri
Deepscorn
7
Rupanya dexOptions.incremental tidak lagi diperlukan karena defaultnya benar, lihat stackoverflow.com/questions/37522668
devconsole
1
Harap pastikan Anda memahami batasan penggunaan java 8 dan tidak semua fitur bahasa kompatibel dengan versi sebelumnya. developer.android.com/guide/platform/j8-jack.html
TrevJonez
3
Perhatikan bahwa " android.dexOptions.incrementalProperti ini tidak digunakan lagi dan tidak berpengaruh pada proses build".
Jonik
16

Jika Anda memiliki modul dengan pustaka java yang bukan khusus Android , ini seharusnya berfungsi:apply plugin:'java'

Letakkan di bagian atas file build.gradle, lalu buat kembali.

    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
sumber
Keren. Terima kasih. Saya akan mencobanya.
Hephaestus
2
Ini adalah solusi yang tepat jika Anda memiliki modul dengan pustaka java yang bukan khusus Android.
gladed
17
Kesalahan: Plugin 'java' telah diterapkan, tetapi tidak kompatibel dengan plugin Android.
Alen Siljak
1
Sepakat. Plugin 'java' tampaknya tidak kompatibel dengan plugin Android. Tidak ada kegembiraan.
Hephaestus
1
@Alen Siljak, terapkan plugin: 'nama plugin Anda' tidak harus java.
nexDev
8

Jika Anda menggunakan org.jetbrains:annotation:15plugin dan retrolambda maka hapus baris compile org.jetbrains:annotations:15.0dari Anda build.gradledan kesalahan akan hilang. Ini bekerja untuk saya.

0wl
sumber
7

Mungkin, beberapa dependensi Anda telah dikompilasi dengan Java 8, bukan untuk Android khususnya. Coba alihkan dependensi itu ke versi yang lebih lama. Saya tidak tahu persis library mana yang harus Anda downgrade, karena Anda belum melampirkan daftar dependensi modul utama Anda.

Misalnya: Saya punya masalah yang sama. Setelah berjam-jam mencari, saya menemukan bahwa perpustakaan org.codehaus.httpcache4j.uribuilder:2.0.0membutuhkan Java 8, pada github . Jadi, ketika saya beralih ke 1.1.0, proyek telah berhasil dibangun dan diterapkan.

fobo66.dll
sumber
fobo66: Ya, saya setuju. Ini cukup banyak yang kami lakukan. Saya pikir, sayangnya, semakin banyak pustaka akan segera dikompilasi dengan Java 8 dan ini kemudian akan menjadi masalah umum. Ini tampak seperti dunia Python di mana banyak pustaka yang tampaknya masih menggunakan 2.6.
Hephaestus
Mungkin kita akan segera menemukan, seperti Python, bahwa semua pustaka tersedia secara terpisah sebagai versi J7 dan J8.
Hephaestus
7

Coba tambahkan ke build.gradle utama di bagian allprojects

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

atau tambahkan ini dalam dependensi

    sourceCompatibility = 1.7
    targetCompatibility = 1.7

di semua modul secara manual

vitalinvent
sumber
7

Saya dapat menyelesaikan masalah ini dengan menambahkan baris berikut:

jackOptions {
    enabled true
}

ke defaultConfigdalam build.gradlefile.

Anda dapat mengikuti pedoman untuk Java 8 di tautan - https://developer.android.com/guide/platform/j8-jack.html

Faisal Ali
sumber
1
Jack tidak digunakan lagi sejak 14 Maret 2017
nhoxbypass
Tautan itu menjelaskan proses menghapus jackOptions. Ini mungkin bukan solusi terbaik.
Anthony Naddeo
5

Saya memiliki masalah yang sama dengan ketergantungan greendao-generator. Saya salah menambahkan ketergantungan itu ke dalam build.gradle ( compile 'org.greenrobot:greendao-generator:3.1.0') saya dan AndroidStudio menunjukkan pesan kesalahan yang sama.

Mungkin karena modul itu telah dikompilasi dengan Java 8.

Jadi saya menghapus ketergantungan itu dari build.gradle saya dan semua dikompilasi dengan senang hati :)

Riccardo Leschiutta
sumber
2

Saya memecahkan masalah ini seperti di bawah ini:

apply plugin: 'java'

sourceCompatibility = 1.7
targetCompatibility = 1.7

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}
李 歆 扬
sumber
2

Mematikan Instant Run di Android Studio 2.2 dengan plugin Gradle 2.2.2 memperbaikinya untuk saya. Beralih kembali ke versi lama plugin Gradle (seperti 2.2.0) juga memperbaikinya, tetapi imho kurang diinginkan.

StephanBezoen
sumber
2

Ini terjadi pada saya dengan Android Studio 2.3.3. Solusi yang saya temukan adalah menghapus folder build dan kemudian Rebuild Project . Sesederhana itu.

mp501
sumber
1

Saya juga menghadapi kesalahan yang sama Android 2.3.3, setelah menambahkan beberapa depensi JAR. Masalahnya karena depenecy io.netty:netty-all:4.1.16.Final. JAR versi 4.1.16 ini dikompilasi dengan Java 1.8 dan yang lainnya dibuat dengan Java 1.7.

Ini bisa diselesaikan, setelah menyertakan versi yang lebih lama netty(yang dibuat dengan Java 1.7) di build.gradlefile saya .

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

rashok
sumber
Datang ke sini dengan masalah yang sama, meskipun halaman netty menyatakan bahwa java 1.6 sudah cukup untuk menggunakan netty.
Tomasz Kryński
0

Saya telah menemukan masalah ini saat mencoba meningkatkan ke nilai otomatis v 1.5 di Android Studio v 2.3.3. Nilai otomatis 1.5 mungkin akan kompatibel dengan AS 3 (Ini membutuhkan kompiler java yang diperbarui)

Untuk saat ini nilai otomatis 1.4.1 berfungsi.

Aleksander Niedziolko
sumber
0

Saya telah menemukan masalah ini saat mencoba mengimpor jar yang dikompilasi oleh jdk 1.8 di Android Studio 3.0. Saya mencoba semua solusi di atas, tetapi tidak ada yang berhasil. jadi, saya meminta pengembang jar itu untuk mengkompilasinya ulang dengan jdk 1.7, dan kemudian bekerja dengan baik, tidak menemukan masalah ini lagi.

paman panjang
sumber