Android: Dex không thể phân tích cú pháp mã phiên bản 52 byte


93

Tôi vừa chuyển sang Android Studio 2.1 và lỗi này xuất hiện khi cố gắng biên dịch một ứng dụng đã hoạt động trước đó:

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.

Tôi đã cập nhật tệp gradle.build của dự án chính để buộc tạo mã 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
    }
}

Tôi cũng đã cập nhật module gradle.build như sau để đặt phiên bản 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
}
}

Mô-đun con đang được xây dựng với Maven. Trong tệp pom.xml, tôi cũng đã cố gắng buộc tạo mã 1.7.
Tôi hiểu rằng tôi đang sử dụng một cấu phần hợp ngữ, kết hợp các mô-đun cấp dưới, nhưng tôi đã không thay đổi bất kỳ mô-đun cấp dưới nào và tệp .jar kết quả cho mô-đun đã chạy tốt trong lần biên dịch trước.

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

Câu hỏi của tôi: 1) Đây có phải là sự cố Android Studio 2.1 không? Những người khác đã nhìn thấy nó? 2) Giả sử đây là lỗi của tôi và vì thông báo lỗi không giúp ích gì trong việc tìm kiếm mô-đun bị lỗi, có khuyến nghị nào về việc tìm mã V52 không? Tôi không thể bỏ qua các thư viện mà không phá vỡ một lượng lớn mã. Người ta có thể kiểm tra tệp .jar để tìm bản sửa đổi mã không? Cảm ơn trước. -Hephaestus


1
Tôi hiện đang gặp phải lỗi này ngay bây giờ. Bất kỳ may mắn cho các giải pháp?
MetaSnarf

Tôi cũng đã cập nhật Android Studio lên 2.1. Kể từ đó tôi đang đối mặt với vấn đề này. Bạn đã có giải pháp nào chưa?
Suresh Kumar

Một thông báo lỗi trước đó (đã biến mất) cho thấy rằng tệp jar pubnub là một phần của sự cố. Vì vậy, chúng tôi đã nhận xét mọi tham chiếu đến pubnub và hiện nó đã biên dịch và chạy. Tôi tin rằng thông báo lỗi đã biến mất khi chúng tôi thêm các chỉ thị trình biên dịch (hiển thị ở trên) để buộc mã thành "1.7", tuy nhiên, có vẻ như một số mã 1.8 vẫn bị rò rỉ.
Hephaestus

Đây là một cuộc thảo luận SO khác có liên quan: stackoverflow.com/questions/36968728/… . Nhưng điều đó không trả lời câu hỏi, ngoài việc nói "bắt đầu với một dự án thử nghiệm đơn giản hơn".
Hephaestus

1
Điều duy nhất chúng tôi làm là rút thư viện PubNub và thay thế bằng một verison cũ hơn. Điều đó dường như đã sửa chữa nó. Nhưng trong trường hợp này, chúng tôi đã kiểm tra bằng cách nhận xét việc nhập thư viện và các lệnh gọi phương thức của nó và xác định rằng nó bị lỗi. Nhưng thư viện PubNub được tích hợp lỏng lẻo và chúng tôi có thể nhận xét nó khá dễ dàng. Nếu chúng ta có nhiều thư viện với sự tích hợp chặt chẽ thì sẽ rất khó khăn.
Hephaestus

Câu trả lời:


89

chỉ cần sử dụng java 1.8 với Android Studio 3.0+ và thiết lập các công việc sau cho tôi: có vẻ như cần các công cụ xây dựng mới nhất

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
Cảm ơn bạn. Tuy nhiên, tôi đang xây dựng lên SDK 19 và tôi lưu ý rằng bạn đang sử dụng 23. Tôi nghĩ rằng Java 8 chỉ dành cho Android N. Tôi không nghĩ rằng tôi có thể sử dụng Java 8 và vẫn tương thích ngược với 19. Tôi có nhầm không?
Hephaestus

3
Tôi đã biên dịch mã với java 8 trong khi nhắm mục tiêu Android N, nhưng chạy ứng dụng trên Android 16 mà không gặp vấn đề gì. Bạn có thể tự mình kiểm tra
Deepscorn

7
Rõ ràng dexOptions.incremental không còn được yêu cầu vì nó được mặc định là true, hãy xem stackoverflow.com/questions/37522668
devconsole,

1
Hãy chắc chắn rằng bạn hiểu những hạn chế của việc sử dụng java 8 và không phải tất cả các tính năng ngôn ngữ đều tương thích ngược. developer.android.com/guide/platform/j8-jack.html
TrevJonez

3
Lưu ý rằng " android.dexOptions.incrementalThuộc tính không được dùng nữa và nó không ảnh hưởng đến quá trình xây dựng."
Jonik

16

Nếu bạn có một mô-đun có thư viện java không dành riêng cho Android , điều này sẽ hoạt động:apply plugin:'java'

Đặt nó ở đầu tệp build.gradle, sau đó xây dựng lại.

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

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

        sourceCompatibility = 1.7
        targetCompatibility = 1.7
    }

Mát mẻ. Cảm ơn. Tôi sẽ thử.
Hephaestus

2
Đây là giải pháp phù hợp nếu bạn có mô-đun có thư viện java không dành riêng cho Android.
gladed

17
Lỗi: Plugin 'java' đã được áp dụng nhưng không tương thích với các plugin Android.
Alen Siljak

1
Đã đồng ý. plugin 'java' dường như không tương thích với các plugin Android. Không có niềm vui.
Hephaestus

1
@Alen Siljak, áp dụng plugin: 'tên plugin của bạn' không nhất thiết phải là java.
nexDev

8

Nếu bạn sử dụng org.jetbrains:annotation:15và retrolambda plugin thì hãy xóa dòng compile org.jetbrains:annotations:15.0khỏi của bạn build.gradlevà lỗi sẽ biến mất. Nó làm việc cho tôi.


7

Có thể, một số phụ thuộc của bạn đã được biên dịch bằng Java 8, đặc biệt không dành cho Android. Cố gắng chuyển phần phụ thuộc đó sang phiên bản cũ hơn. Tôi không biết chính xác bạn nên hạ cấp thư viện nào, vì bạn chưa đính kèm danh sách các phụ thuộc của mô-đun chính của mình.

Ví dụ: Tôi đã có cùng một vấn đề. Sau nhiều giờ tìm kiếm, tôi thấy rằng thư viện org.codehaus.httpcache4j.uribuilder:2.0.0yêu cầu Java 8, kể từ github . Vì vậy, khi tôi chuyển sang 1.1.0, dự án đã được xây dựng và triển khai thành công.


fobo66: Vâng, tôi đồng ý. Đây là khá nhiều những gì chúng tôi đã làm. Tôi nghĩ, thật không may, ngày càng nhiều thư viện sẽ sớm được biên dịch với Java 8 và đây sẽ là một vấn đề phổ biến. Điều này có vẻ giống như thế giới của Python nơi nhiều thư viện dường như vẫn ở trên 2.6.
Hephaestus

Có lẽ chúng ta sẽ sớm thấy, giống như Python, tất cả các thư viện đều có sẵn riêng biệt dưới dạng cả phiên bản J7 và J8.
Hephaestus

7

Cố gắng thêm vào main build.gradle trong phần allprojects

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

hoặc thêm điều này vào phần phụ thuộc

    sourceCompatibility = 1.7
    targetCompatibility = 1.7

trong tất cả các mô-đun theo cách thủ công


7

Tôi đã có thể giải quyết vấn đề này bằng cách thêm các dòng sau:

jackOptions {
    enabled true
}

để defaultConfigtrong build.gradletập tin.

Bạn có thể làm theo các hướng dẫn cho Java 8 trên liên kết - https://developer.android.com/guide/platform/j8-jack.html


1
Jack bị phản đối kể từ ngày 14 tháng ba năm 2017
nhoxbypass

Liên kết đó mô tả quá trình loại bỏ jackOptions. Đây có lẽ không phải là giải pháp tốt nhất.
Anthony Naddeo

5

Tôi đã gặp vấn đề tương tự với sự phụ thuộc của máy phát điện greendao. Tôi đã nhầm lẫn phần phụ thuộc đó vào build.gradle ( compile 'org.greenrobot:greendao-generator:3.1.0') và AndroidStudio đã hiển thị cho tôi thông báo lỗi tương tự.

Có thể là do mô-đun đó đã được biên dịch bằng Java 8.

Vì vậy, tôi đã loại bỏ sự phụ thuộc đó khỏi build.gradle của mình và tất cả được biên dịch một cách vui vẻ :)


2

Tôi đã giải quyết vấn đề này như bên dưới:

apply plugin: 'java'

sourceCompatibility = 1.7
targetCompatibility = 1.7

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

2

Việc tắt Instant Run trong Android Studio 2.2 với plugin Gradle 2.2.2 đã khắc phục sự cố cho tôi. Việc chuyển trở lại phiên bản cũ hơn của plugin Gradle (chẳng hạn như 2.2.0) cũng đã khắc phục được lỗi này, nhưng điều đó ít mong muốn hơn.


2

Điều này đã xảy ra với tôi với Android Studio 2.3.3. Giải pháp tôi tìm thấy là xóa thư mục xây dựng và sau đó xây dựng lại Dự án . nó đơn giản như vây thôi.


1

Tôi cũng gặp phải lỗi tương tự trong Android 2.3.3, sau khi thêm một số đoạn trích JAR. Vấn đề là do người phụ thuộc io.netty:netty-all:4.1.16.Final. Phiên bản 4.1.16 này JAR được biên dịch bằng Java 1.8 và tất cả các phiên bản khác được tạo bằng Java 1.7.

Điều này được giải quyết, sau khi bao gồm phiên bản cũ hơn của netty(được tạo bằng Java 1.7) trong build.gradletệp của tôi .

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


Đến đây với cùng một vấn đề, mặc dù trang netty nói rằng java 1.6 là đủ để sử dụng netty.
Tomasz Kryński

0

Tôi đã gặp sự cố này khi cố gắng nâng cấp lên giá trị tự động v 1.5 trong Android Studio v 2.3.3. Giá trị tự động 1.5 có lẽ sẽ tương thích với AS 3 (Nó yêu cầu trình biên dịch java cập nhật)

Hiện tại, giá trị tự động 1.4.1 hoạt động.



0

Tôi đã gặp sự cố này khi cố gắng nhập một jar được biên dịch bởi jdk 1.8 trong Android Studio 3.0. Tôi đã thử tất cả các giải pháp trên, nhưng không có tác dụng. vì vậy, tôi đã yêu cầu nhà phát triển của jar đó biên dịch lại nó với jdk 1.7 và sau đó nó hoạt động tốt, không gặp phải vấn đề này nữa.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.