簡體   English   中英

Android:Dex無法解析版本52字節的代碼

[英]Android: Dex cannot parse version 52 byte code

我剛剛切換到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文件來查找代碼修訂版嗎? 提前致謝。 -Hephaestus

只需使用帶有Android Studio 3.0+的java 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
    }
}

如果您的模塊具有非特定於Android的Java庫, 那么這應該可行: 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
    }

如果您使用org.jetbrains:annotation:15和retrolambda插件然后刪除行compile org.jetbrains:annotations:15.0從您build.gradle和錯誤將消失。 這個對我有用。

可能,您的一些依賴項是使用Java 8編譯的,而不是針對Android編譯的。 嘗試將該依賴項切換為舊版本。 我不確切地知道您應該降級哪個庫,因為您沒有附加主模塊的依賴項列表。

例如:我遇到了同樣的問題。 經過幾個小時的搜索,我發現庫org.codehaus.httpcache4j.uribuilder:2.0.0需要Java 8,從github開始 因此,當我切換到1.1.0 ,項目已成功構建和部署。

嘗試在allprojects部分中添加到main build.gradle

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

或者在依賴項中添加它

    sourceCompatibility = 1.7
    targetCompatibility = 1.7

所有模塊中手動

我能夠通過添加以下行來解決此問題:

jackOptions {
    enabled true
}

build.gradle文件中的defaultConfig

您可以在鏈接上遵循Java 8指南 - https://developer.android.com/guide/platform/j8-jack.html

我對greendao-generator依賴有同樣的問題。 我錯誤地將依賴添加到我的build.gradle( compile 'org.greenrobot:greendao-generator:3.1.0' )和AndroidStudio向我顯示了相同的錯誤消息。

可能是因為該模塊已使用Java 8編譯。

所以我從build.gradle中刪除了這個依賴項,所有編譯都愉快地:)

我解決了這個問題如下:

apply plugin: 'java'

sourceCompatibility = 1.7
targetCompatibility = 1.7

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

使用Gradle插件2.2.2關閉Android Studio 2.2中的Instant Run,為我修復了它。 切換回Gradle插件的舊版本(例如2.2.0)也修復了它,但這不太合適。

Android Studio 2.3.3發生了這種情況。 我找到的解決方案是刪除build文件夾,然后刪除Rebuild Project 就這么簡單。

在添加幾個JAR依賴項之后,我在Android 2.3.3也遇到了同樣的錯誤。 問題是由於依賴性io.netty:netty-all:4.1.16.Final 這個4.1.16版本的JAR是用Java 1.8編譯的,其他所有版本都是用Java 1.7生成的。

在我的build.gradle文件中包含舊版本的netty (使用Java 1.7生成)之后,這個build.gradle

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

嘗試在Android Studio v 2.3.3中升級到自動值v 1.5時遇到此問題。 自動值1.5可能與AS 3兼容(它需要更新的java編譯器)

目前自動值1.4.1有效。

我面臨與Android和RxJava 2的Reactive Location API庫相同的問題。將build.gradle更新到3.0.1並將Android反應位置API庫和RxJava 2庫版本從1.0.4減少到1.0.3它工作正常在我的情況下。

在嘗試導入由Android Studio 3.0中的jdk 1.8編譯的jar時,我遇到了這個問題。 我嘗試了所有上述解決方案,但沒有工作。 所以,我問那個jar的開發人員用jdk 1.7重新編譯它,然后它運行良好,沒有再遇到這個問題。

如果可能的話:

  1. 將android工具升級到:classpath'com.android.tools.build:grad:3.0.0'
  2. buildToolsVersion“26.0.2”

這應該解決這個問題。

參考: https//developer.android.com/studio/write/java8-support

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM