Android: Dex, sürüm 52 bayt kodunu ayrıştıramıyor


93

Az önce Android Studio 2.1'e geçtim ve daha önce çalışmakta olan bir uygulamayı derlemeye çalışırken bu hata ortaya çıktı:

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.

Java 1.7 kod üretimini zorlamak için ana projenin gradle.build dosyasını zaten güncellemiştim:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.0'
        apply plugin: 'java'
        sourceCompatibility = 1.7
        targetCompatibility = 1.7
    }
}

Java sürümünü ayarlamak için gradle.build modülünü de şu şekilde güncelledim:

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 ile inşa edilen alt modül. Pom.xml dosyasında ayrıca 1.7 kod üretimini zorlamaya çalıştım.
Alt modülleri içeren bir derleme yapısı kullandığımı anlıyorum, ancak alt modüllerin hiçbirini değiştirmedim ve modül için ortaya çıkan .jar dosyası son derlememde iyi çalıştı.

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

Sorum: 1) Bu bir Android Studio 2.1 sorunu mu? Başkaları gördü mü? 2) Bunun benim hatam olduğunu varsayarsak ve hata mesajı bozuk modülü bulmaya yardımcı olmadığından, V52 kodunu bulma konusunda herhangi bir öneri var mı? Büyük miktarda kodu bozmadan kitaplıkları atlayamam. Kod revizyonunu bulmak için bir .jar dosyası incelenebilir mi? Şimdiden teşekkürler. -Hephaestus


1
Şu anda şu anda bu hatayla karşılaşıyorum. Çözümler için şansınız var mı?
MetaSnarf

Ben de Android Studio'yu 2.1'e güncelledim. O zamandan beri bu sorunla karşı karşıyayım. Herhangi bir çözümün var mı?
Emin Kaya

Daha önceki bir hata mesajı (o zamandan beri ortadan kalktı) pubnub jar dosyasının sorunun bir parçası olduğunu gösteriyor. Bu yüzden pubnub'a yapılan her referansı yorumladık ve şimdi derlenip çalışıyor. Kodu "1.7" ye zorlamak için derleyici direktiflerini (yukarıda gösterilen) eklediğimizde hata mesajının kaybolduğuna inanıyorum, ancak 1.8 kodunun bir kısmı hala sızıyor gibi görünüyor.
Hephaestus

İşte ilgili başka bir SO tartışması: stackoverflow.com/questions/36968728/… . Ancak bu soruya cevap vermeyen, "daha basit bir test projesiyle başla" demek dışında.
Hephaestus

1
Yaptığımız tek şey PubNub kütüphanesini çıkarmak ve daha eski bir sürümle değiştirmek oldu. Düzelmiş gibiydi. Ancak bu durumda, kütüphane içe aktarımını ve yöntem çağrılarını yorumlayarak ve hatalı olduğunu belirleyerek test ettik. Ancak PubNub kütüphanesi gevşek bir şekilde entegre edildi ve oldukça kolay bir şekilde yorumlayabilirdik. Sıkı entegrasyona sahip birçok kütüphanemiz olsaydı, acı olurdu.
Hephaestus

Yanıtlar:


89

java 1.8'i Android Studio 3.0+ ile kullanın ve benim için aşağıdaki çalışmaları ayarlayın: en son derleme araçlarına ihtiyaç var gibi görünüyor

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

ve

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
Teşekkür ederim. Ancak, SDK 19'u geliştiriyorum ve 23'te olduğunuzu fark ediyorum. Java 8'in yalnızca Android N için olduğunu düşünmüştüm. Java 8'i kullanabileceğimi ve hala 19 ile geriye dönük uyumlu olabileceğimi sanmıyorum. Yanlış mıyım?
Hephaestus

3
Android N'yi hedeflerken java 8 ile kod derledim, ancak uygulamayı Android 16'da sorunsuz çalıştırdım. Kendiniz test edebilirsiniz
Deepscorn

7
Görünüşe göre dexOptions.incremental, varsayılan olarak true olduğu için artık gerekli değil, bkz. Stackoverflow.com/questions/37522668
devconsole

1
Lütfen java 8 kullanmanın sınırlamalarını anladığınızdan ve tüm dil özelliklerinin geriye dönük olarak uyumlu olmadığından emin olun. developer.android.com/guide/platform/j8-jack.html
TrevJonez

3
" android.dexOptions.incrementalÖzelliğin kullanımdan kaldırıldığını ve derleme süreci üzerinde hiçbir etkisi olmadığını" unutmayın .
Jonik

16

Android'e özgü olmayan bir java kitaplığına sahip bir modülünüz varsa , bu çalışmalıdır:apply plugin:'java'

Bunu build.gradle dosyasının en üstüne koyun, ardından yeniden oluşturun.

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

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

        sourceCompatibility = 1.7
        targetCompatibility = 1.7
    }

Güzel. Teşekkürler. Bir deneyeceğim.
Hephaestus

2
Android'e özgü olmayan bir java kitaplığına sahip bir modülünüz varsa bu doğru çözümdür.
2016

17
Hata: 'java' eklentisi uygulandı, ancak Android eklentileriyle uyumlu değil.
Alen Siljak

1
Kabul. Görünüşe göre 'java' eklentisi Android eklentileriyle uyumsuz. Neşe yok.
Hephaestus

1
@Alen Siljak, eklentiyi uygulayın: 'eklenti adınız' java olmak zorunda değil.
nexDev

8

Eğer kullanırsanız org.jetbrains:annotation:15ve retrolambda eklentisi kullanırsanız , satırınızı compile org.jetbrains:annotations:15.0sizden kaldırın build.gradleve hata kaybolacaktır. Benim için çalışıyor.


7

Muhtemelen bazı bağımlılıklarınız özellikle Android için değil Java 8 ile derlenmiştir. Bu bağımlılıkları eski sürüme geçirmeyi deneyin. Hangi kitaplığı düşürmeniz gerektiğini tam olarak bilmiyorum çünkü ana modülünüzün bağımlılıklarının bir listesini eklemediniz.

Örneğin: Aynı sorunu yaşadım. Saatler süren araştırmalardan sonra, kütüphanenin github'dan itibarenorg.codehaus.httpcache4j.uribuilder:2.0.0 Java 8 gerektirdiğini öğrendim . Bu yüzden, geçiş yaptığımda , proje başarıyla oluşturuldu ve dağıtıldı.1.1.0


fobo66: Evet, katılıyorum. Yaptığımız şey bu. Bence maalesef yakında daha fazla kütüphane Java 8 ile derlenecek ve o zaman bu yaygın bir sorun olacak. Bu tıpkı birçok kütüphanenin hala 2.6'da olduğu Python dünyasına benziyor.
Hephaestus

Belki yakında Python gibi, tüm kitaplıkların hem J7 hem de J8 sürümleri olarak ayrı ayrı mevcut olduğunu keşfedeceğiz.
Hephaestus

7

Bölüm ana build.gradle eklemek deneyin allprojects

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

veya bunu bağımlılıklara ekleyin

    sourceCompatibility = 1.7
    targetCompatibility = 1.7

içinde bütün modüllerin elle



5

Greendao-generator bağımlılığıyla aynı sorunu yaşadım. Bu bağımlılığı yanlışlıkla build.gradle ( compile 'org.greenrobot:greendao-generator:3.1.0') cihazıma ekledim ve AndroidStudio bana aynı hata mesajını gösterdi.

Muhtemelen bu modül Java 8 ile derlenmiş olduğu içindir.

Bu yüzden bu bağımlılığı build.gradle'ımdan kaldırdım ve hepsi mutlu bir şekilde derlendi :)


2

Bu sorunu aşağıdaki gibi çözdüm:

apply plugin: 'java'

sourceCompatibility = 1.7
targetCompatibility = 1.7

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

2

Gradle eklentisi 2.2.2 ile Android Studio 2.2'de Anında Çalıştır'ı kapatmak benim için sorunu çözdü. Gradle eklentisinin eski bir sürümüne (2.2.0 gibi) geri dönmek de sorunu çözdü, ancak bu daha az arzu edilen bir şey.


2

Bu, Android Studio 2.3.3 ile başıma geldi. Bulduğum çözüm, yapı klasörünü silmek ve ardından Projeyi Yeniden Oluşturmaktı . Bu kadar basitti.


1

Android 2.3.3Birkaç JAR deposu ekledikten sonra da aynı hatayla karşılaştım . Sorun bağımlılıktan kaynaklanıyordu io.netty:netty-all:4.1.16.Final. Bu 4.1.16 sürümü JAR, Java 1.8 ile derlendi ve diğerlerinin tümü Java 1.7 ile oluşturuldu.

Dosyamın eski sürümünü netty(Java 1.7 ile oluşturulmuş) ekledikten sonra bu sorun çözüldü build.gradle.

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


Netty sayfası java 1.6'nın netty kullanmak için yeterli olduğunu belirtmesine rağmen, buraya aynı sorunla geldi.
Tomasz Kryński

0

Android Studio v 2.3.3'te otomatik değer v 1.5'e yükseltmeye çalışırken bu sorunla karşılaştım. Otomatik değer 1.5 muhtemelen AS 3 ile uyumlu olacaktır (Güncellenmiş bir java derleyicisi gerektirir)

Şimdilik otomatik değer 1.4.1 çalışıyor.



0

Android Studio 3.0'da jdk 1.8 tarafından derlenen bir kavanozu içe aktarmaya çalışırken bu sorunla karşılaştım. Yukarıdaki tüm çözümleri denedim ama hiçbiri işe yaramadı. bu yüzden, bu kavanozun geliştiricisinden onu jdk 1.7 ile yeniden derlemesini istedim ve sonra iyi çalışıyor, bu sorunla bir daha karşılaşmadım.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.