Android:Dex无法解析版本52字节代码

时间:2016-05-04 06:48:04

标签: java android maven android-studio

我刚刚切换到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

15 个答案:

答案 0 :(得分:86)

只需使用带有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
    }
}

答案 1 :(得分:16)

如果您的模块包含不是特定于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
    }

答案 2 :(得分:8)

如果您使用org.jetbrains:annotation:15和retrolambda插件,请从compile org.jetbrains:annotations:15.0中删除行build.gradle,错误就会消失。它对我有用。

答案 3 :(得分:7)

可能有些依赖项是使用Java 8编译的,而不是针对Android编译的。尝试将该依赖项切换为旧版本。我不知道你应该降级哪个库,因为你没有附上主模块的依赖列表。

例如:我遇到了同样的问题。经过几个小时的搜索,我发现库org.codehaus.httpcache4j.uribuilder:2.0.0需要Java 8,从github开始。因此,当我切换到1.1.0时,项目已成功构建和部署。

答案 4 :(得分:7)

尝试在 allprojects

部分添加到main build.gradle
tasks.withType(JavaCompile) {
    sourceCompatibility = "1.7"
    targetCompatibility = "1.7"
}

或在依赖项

中添加此项
    sourceCompatibility = 1.7
    targetCompatibility = 1.7

所有模块 手动

答案 5 :(得分:7)

我能够通过添加以下行来解决这个问题:

jackOptions {
    enabled true
}

defaultConfig文件中的build.gradle

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

答案 6 :(得分:5)

我对greendao-generator依赖有同样的问题。我错误地将依赖项添加到我的build.gradle(compile 'org.greenrobot:greendao-generator:3.1.0')和AndroidStudio中,向我显示了相同的错误消息。

可能是因为该模块已使用Java 8编译。

所以我从build.gradle中删除了这个依赖项,所有编译都很愉快:)

答案 7 :(得分:2)

我解决了下面这个问题:

apply plugin: 'java'

sourceCompatibility = 1.7
targetCompatibility = 1.7

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

答案 8 :(得分:2)

使用Gradle插件2.2.2关闭Android Studio 2.2中的Instant Run,为我修复了它。切换回Gradle插件的旧版本(例如2.2.0)也修复了它,但这不太适合imho。

答案 9 :(得分:2)

Android Studio 2.3.3发生了这种情况。我找到的解决方案是删除构建文件夹,然后重建项目。就这么简单。

答案 10 :(得分:1)

在添加少量JAR依赖项后,我在Android 2.3.3中也遇到了同样的错误。问题是由于依赖性io.netty:netty-all:4.1.16.Final。这个4.1.16版本的JAR是用Java 1.8编译的,其他所有版本都是用Java 1.7生成的。

在我的netty文件中包含较旧版本的build.gradle(使用Java 1.7生成)之后,这个问题得到了解决。

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

答案 11 :(得分:0)

尝试在Android Studio v 2.3.3中升级到自动值v 1.5时遇到此问题。自动值1.5可能与AS 3兼容(它需要更新的java编译器)

现在自动值1.4.1有效。

答案 12 :(得分:0)

我面临与Reactive Location APIs Library for Android and RxJava 2相同的问题。只需将build.gradle更新为3.0.1并将Reactive Location APIs Library for Android and RxJava 2库版本从1.0.4减少到1.0.3 它在我的情况下工作正常。

答案 13 :(得分:0)

我在Android Studio 3.0中尝试导入由jdk 1.8编译的jar时遇到过这个问题。我尝试了所有上述解决方案,但没有工作。所以,我问那个jar的开发人员用jdk 1.7重新编译它,然后它运行良好,没有再遇到这个问题。

答案 14 :(得分:0)

如果可能的话:

  1. 将android工具升级为:classpath'com.android.tools.build:gradle:3.0.0'
  2. buildToolsVersion“ 26.0.2”

这应该解决问题。

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