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 फ़ाइल को जावा 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 को भी अद्यतन किया था:

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) क्या यह एक एंड्रॉइड स्टूडियो 2.1 समस्या है? क्या दूसरों ने इसे देखा है? 2) यह मानते हुए कि यह मेरी त्रुटि है और चूंकि त्रुटि संदेश खराब मॉड्यूल को खोजने में कोई मदद नहीं करता है, क्या V52 कोड खोजने के लिए कोई सिफारिशें हैं? मैं बड़ी मात्रा में कोड को तोड़े बिना पुस्तकालयों को छोड़ नहीं सकता। क्या कोई कोड संशोधन खोजने के लिए .jar फ़ाइल का निरीक्षण कर सकता है? अग्रिम में धन्यवाद। -Hephaestus


1
मैं अभी इस त्रुटि का सामना कर रहा हूं। समाधान के लिए कोई भाग्य?
मेटासरफ

मी ने भी एंड्रॉइड स्टूडियो को 2.1 में अपडेट किया। तब से मैं इस समस्या का सामना कर रहा हूं। क्या आपको कोई समाधान मिला?
सुरेश कुमार

पहले वाला त्रुटि संदेश (जो तब चला गया है) बताता है कि पबनब जार फ़ाइल समस्या का हिस्सा थी। इसलिए हमने पबनाब के हर संदर्भ पर टिप्पणी की और यह अब संकलन और चलाता है। मेरा मानना ​​है कि कोड को "1.7" के लिए मजबूर करने के लिए जब हमने संकलक निर्देश (ऊपर दिखाए गए) को जोड़ा तो त्रुटि संदेश चला गया, हालांकि ऐसा लगता है कि 1.8 कोड में से कुछ अभी भी लीक हो रहा था।
हेफेस्टस

यहाँ एक और SO चर्चा है जो संबंधित है: stackoverflow.com/questions/36968728/… । लेकिन जो सवाल का जवाब नहीं देता है, उसके अलावा "एक सरल परीक्षण परियोजना के साथ शुरू" कहना है।
हेफेस्टस

1
केवल एक चीज हमने पब्नब लाइब्रेरी को बाहर निकाला और एक पुराने वर्जन के साथ प्रतिस्थापित किया। यह तय करने के लिए लग रहा था। लेकिन इस मामले में, हमने लाइब्रेरी आयात और इसकी विधि कॉल पर टिप्पणी करके और यह निर्धारित करने का परीक्षण किया कि यह गलती पर था। लेकिन पबनब लाइब्रेरी बहुत कम एकीकृत थी और हम इसे बहुत आसानी से टिप्पणी कर सकते थे। यदि हमारे पास बहुत सारे पुस्तकालय हैं, तो यह बहुत ही दर्दनाक होगा।
हेफेस्टस

जवाबों:


89

बस एंड्रॉइड स्टूडियो 3.0+ के साथ जावा 1.8 का उपयोग करें और मेरे लिए निम्नलिखित कार्य सेट करें: ऐसा लगता है कि नवीनतम बिल्ड टूल की आवश्यकता है

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
धन्यवाद। हालांकि, मैं एसडीके 19 का निर्माण कर रहा हूं और मैं ध्यान देता हूं कि आप 23 वर्ष के हैं। मैंने सोचा कि जावा 8 केवल एंड्रॉइड एन के लिए था। मुझे नहीं लगता कि मैं जावा 8 का उपयोग कर सकता हूं और अभी भी 19 के संगत हो सकता हूं। क्या मैं गलत हूं?
हेफेस्टस

3
मैंने एंड्रॉइड एन को लक्षित करते हुए जावा 8 के साथ कोड संकलित किया, लेकिन एंड्रॉइड 16 पर ऐप को बिना किसी समस्या के चलाया। आप इसे स्वयं परीक्षण कर सकते हैं
डिप्सकॉर्न

7
स्पष्ट रूप से dexOptions.incremental की अब आवश्यकता नहीं है क्योंकि यह सत्य के लिए चूक है, देखें stackoverflow.com/questions/37522668
devconsole

1
कृपया सुनिश्चित करें कि आप जावा 8 के उपयोग की सीमाओं को समझते हैं और यह कि सभी भाषा सुविधाएँ पीछे की ओर संगत नहीं हैं। developer.android.com/guide/platform/j8-jack.html
TrevJonez

3
ध्यान दें कि " android.dexOptions.incrementalसंपत्ति पदावनत है और इसका निर्माण प्रक्रिया पर कोई प्रभाव नहीं है।"
जोनिक

16

यदि आपके पास जावा लाइब्रेरी वाला कोई मॉड्यूल है जो 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
यह एक सही समाधान है यदि आपके पास जावा लाइब्रेरी वाला मॉड्यूल है जो एंड्रॉइड-विशिष्ट नहीं है।
खुशी हुई

17
त्रुटि: 'जावा' प्लगइन लागू किया गया है, लेकिन यह एंड्रॉइड प्लगइन्स के साथ संगत नहीं है।
एलन सिल्जाक

1
माना। 'जावा' प्लगइन जाहिरा तौर पर एंड्रॉइड प्लगइन्स के साथ असंगत है। कोई आनंद नहीं है।
Hephaestus

1
@ एलेन सिलजक, प्लगइन लागू करें: 'आपके प्लगइन का नाम' जावा होना जरूरी नहीं है।
nexDev

8

यदि आप उपयोग करते हैं org.jetbrains:annotation:15और रेट्रोलंबा प्लगइन है तो compile org.jetbrains:annotations:15.0अपनी लाइन को हटा दें build.gradleऔर त्रुटि गायब हो जाएगी। इससे मेरा काम बनता है।


7

संभवतः, आपकी कुछ निर्भरताएँ विशेष रूप से Android के लिए नहीं, जावा 8 के साथ संकलित की गई थीं। उस निर्भरता को पुराने संस्करण में बदलने का प्रयास करें। मुझे ठीक से पता नहीं है कि आपको किस लाइब्रेरी को डाउनग्रेड करना चाहिए, क्योंकि आपने अपने मुख्य मॉड्यूल की निर्भरता की सूची संलग्न नहीं की है।

उदाहरण के लिए: मैं एक ही समस्या थी। खोज के घंटों के बाद, मैंने पाया है कि पुस्तकालय org.codehaus.httpcache4j.uribuilder:2.0.0को जावा 8 की आवश्यकता है, जैसा कि जीथब के रूप में है । इसलिए, जब मैंने स्विच किया है 1.1.0, तो प्रोजेक्ट सफलतापूर्वक बनाया और तैनात किया गया है।


fobo66: हाँ, मैं सहमत हूँ। यह बहुत ज्यादा है जो हमने किया। मुझे लगता है, दुर्भाग्य से, अधिक से अधिक पुस्तकालयों को जल्द ही जावा 8 के साथ संकलित किया जाएगा और फिर यह एक सामान्य मुद्दा होगा। यह पाइथन की दुनिया की तरह लगता है, जहां कई पुस्तकालय अभी भी 2.6 पर लगते हैं।
हेफेस्टस

शायद हम जल्द ही पायथन की तरह पाएंगे कि सभी पुस्तकालय जे 7 और जे 8 संस्करणों के रूप में अलग-अलग उपलब्ध हैं।
हेफेस्टस

7

खंड allprojects में मुख्य build.gradle में जोड़ने का प्रयास करें

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

या निर्भरता में यह जोड़ें

    sourceCompatibility = 1.7
    targetCompatibility = 1.7

में सभी मॉड्यूल मैन्युअल


7

मैं निम्नलिखित पंक्तियों को जोड़कर इस समस्या को हल करने में सक्षम था:

jackOptions {
    enabled true
}

करने defaultConfigमें build.gradleफ़ाइल।

आप लिंक पर जावा 8 के लिए दिशानिर्देशों का पालन कर सकते हैं - https://developer.android.com/guide/platform/j8-jpg.html


1
14 मार्च 2017 से जैक को पदावनत कर दिया गया है
nhoxbypass

यह लिंक जैकओशन को हटाने की प्रक्रिया का वर्णन करता है। यह शायद सबसे अच्छा समाधान नहीं है।
एंथनी नादेदेव

5

मुझे जेरेन्डो-जनरेटर निर्भरता के साथ भी यही समस्या थी। मैंने गलती से उस बिल्ड को अपने बिल्ड.ग्रेडल ( compile 'org.greenrobot:greendao-generator:3.1.0') में जोड़ दिया और AndroidStudio ने मुझे वही त्रुटि संदेश दिखाया।

संभवतः यह है क्योंकि उस मॉड्यूल को जावा 8 के साथ संकलित किया गया है।

तो मैंने अपने build.gradle से उस निर्भरता को हटा दिया और सभी खुशी से संकलित हो गए :)


2

मैंने इस समस्या को नीचे के रूप में हल किया है:

apply plugin: 'java'

sourceCompatibility = 1.7
targetCompatibility = 1.7

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

2

एंड्रॉइड स्टूडियो में इंस्टेंट रन स्विचिंग को ग्रैडल प्लगइन 2.2.2 के साथ मेरे लिए तय किया। ग्रैगल प्लगइन के पुराने संस्करण (जैसे 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 जावा 1.8 के साथ संकलित किया गया था और अन्य सभी जावा 1.7 के साथ उत्पन्न हुए थे।

nettyमेरी build.gradleफ़ाइल के पुराने संस्करण (जो जावा 1.7 के साथ जनरेट किया गया था) को शामिल करने के बाद, यह हल हो गया ।

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


एक ही मुद्दे के साथ यहां आया, हालांकि नेट्टी पेज बता रहा है कि जावा 1.6 नेट्टी का उपयोग करने के लिए पर्याप्त है।
टॉमस क्रायस्की

0

एंड्रॉइड स्टूडियो v 2.3.3 में ऑटो-मूल्य v 1.5 में अपग्रेड करने का प्रयास करते समय मैं इस मुद्दे पर आया हूं। ऑटो-मूल्य 1.5 संभवतः 3 के साथ संगत होगा (इसके लिए एक अद्यतन जावा कंपाइलर की आवश्यकता होती है)

अभी के लिए ऑटो-वैल्यू 1.4.1 काम करता है।


0

मैं Android और RxJava 2 के लिए प्रतिक्रियाशील स्थान APIs लाइब्रेरी के साथ एक ही मुद्दे का सामना करता हूं। बस अद्यतन build.gradle को 3.0.1 करें और Android और RxJava 2 पुस्तकालय संस्करण के लिए प्रतिक्रियाशील स्थान API लाइब्रेरी को 1.0.4 से 1.0.3 तक कम करें। यह ठीक काम करता है। मेरे मामले में।


0

एंड्रॉइड स्टूडियो 3.0 में jdk 1.8 द्वारा संकलित एक जार को आयात करने की कोशिश करते समय मैं इस मुद्दे पर आया हूं। मैंने उपरोक्त सभी समाधानों की कोशिश की, लेकिन कोई काम नहीं किया। इसलिए, मैंने उस जार के डेवलपर को इसे jdk 1.7 के साथ फिर से संकलित करने के लिए कहा, और फिर यह अच्छी तरह से काम करता है, फिर इस मुद्दे पर नहीं आया।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.