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 เกินไปแล้ว ตั้งแต่นั้นมาฉันก็ประสบปัญหานี้ คุณมีวิธีแก้ไขหรือไม่?
Suresh Kumar

ข้อความแสดงข้อผิดพลาดก่อนหน้านี้ (ที่หายไปแล้ว) แสดงว่าไฟล์ jar pubnub เป็นส่วนหนึ่งของปัญหา ดังนั้นเราจึงแสดงความคิดเห็นทุกการอ้างอิงถึง pubnub และตอนนี้มันก็รวบรวมและทำงาน ฉันเชื่อว่าข้อความแสดงข้อผิดพลาดหายไปเมื่อเราเพิ่มคำสั่งคอมไพเลอร์ (ที่แสดงด้านบน) เพื่อบังคับให้โค้ดเป็น "1.7" แต่ดูเหมือนว่าโค้ด 1.8 บางส่วนยังคงรั่วไหล
Hephaestus

นี่เป็นอีกหนึ่งการอภิปราย SO ที่เกี่ยวข้อง: stackoverflow.com/questions/36968728/... แต่ข้อใดไม่ตอบคำถามนอกจากพูดว่า "เริ่มต้นด้วยโครงการทดสอบที่ง่ายกว่า"
Hephaestus

1
สิ่งเดียวที่เราทำคือดึงไลบรารี PubNub และแทนที่ด้วยเวอร์ชันเก่า ดูเหมือนว่าจะแก้ไขได้ แต่ในกรณีนี้เราทดสอบโดยแสดงความคิดเห็นเกี่ยวกับการนำเข้าไลบรารีและวิธีการเรียกใช้และพิจารณาว่าเป็นความผิด แต่ไลบรารี PubNub ถูกรวมเข้าด้วยกันอย่างหลวม ๆ และเราสามารถแสดงความคิดเห็นได้อย่างง่ายดาย หากเรามีห้องสมุดจำนวนมากที่มีการรวมเข้าด้วยกันอย่างแน่นหนาก็คงจะเจ็บปวด
Hephaestus

คำตอบ:


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 แบบย้อนหลัง
Hephaestus

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
    }

เย็น. ขอบคุณ. ฉันจะลองดู
Hephaestus

2
นี่เป็นวิธีแก้ปัญหาที่เหมาะสมหากคุณมีโมดูลที่มีไลบรารี java ที่ไม่ใช่เฉพาะ Android
ดีใจ

17
ข้อผิดพลาด: มีการใช้ปลั๊กอิน 'java' แต่เข้ากันไม่ได้กับปลั๊กอิน Android
Alen Siljak

1
เห็นด้วย ดูเหมือนว่าปลั๊กอิน 'java' จะเข้ากันไม่ได้กับปลั๊กอิน Android ไม่มีความสุข
Hephaestus

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
Hephaestus

บางทีเราอาจจะพบในไม่ช้าเช่น Python ที่ไลบรารีทั้งหมดมีจำหน่ายแยกต่างหากทั้งในรุ่น J7 และ J8
Hephaestus

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


1
Jack เลิกใช้งานตั้งแต่ 14 มีนาคม 2017
nhoxbypass

ลิงค์นั้นอธิบายขั้นตอนการลบ jackOptions นี่อาจไม่ใช่ทางออกที่ดีที่สุด
Anthony Naddeo

5

ฉันมีปัญหาเดียวกันกับการพึ่งพาเครื่องกำเนิดไฟฟ้า greendao ฉันเพิ่มการพึ่งพานั้นลงใน 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(ซึ่งสร้างด้วย Java 1.7) ในbuild.gradleไฟล์ของฉัน

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

ฉันประสบปัญหาเดียวกันกับReactive Location APIs Library สำหรับ Android และ RxJava 2เพียงอัปเดต build.gradle เป็น 3.0.1 และลด Reactive Location APIs Library สำหรับ Android และ RxJava 2เวอร์ชันไลบรารีจาก 1.0.4 เป็น 1.0.3 มันทำงานได้ดี ในกรณีของฉัน


0

ฉันเจอปัญหานี้เมื่อพยายามนำเข้า jar ที่รวบรวมโดย jdk 1.8 ใน Android Studio 3.0 ฉันลองวิธีแก้ปัญหาข้างต้นทั้งหมดแล้ว แต่ไม่มีผล ดังนั้นฉันจึงขอให้นักพัฒนาของ jar นั้นรวบรวมใหม่ด้วย jdk 1.7 จากนั้นก็ใช้งานได้ดีไม่พบปัญหานี้อีก


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.