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

我也将Android Studio更新为2.1。从那时起,我面临着这个问题。你有什么解决办法吗?
Suresh Kumar

较早的错误消息(此后已消失)表明pubnub jar文件是问题的一部分。因此,我们注释掉了对pubnub的所有引用,现在可以编译并运行它。我相信,当我们添加编译器指令(如上所示)以将代码强制为“ 1.7”时,错误消息消失了,但是似乎某些1.8代码仍在泄漏。
赫菲斯托斯

这是另一个相关的SO讨论:stackoverflow.com/questions/36968728/…。但是,除了说“从一个简单的测试项目开始”之外,这没有回答问题。
赫菲斯托斯

1
我们唯一要做的就是拔出PubNub库,并替换为较旧的版本。那似乎解决了。但是在这种情况下,我们通过注释掉库导入及其方法调用并确定它有错误来进行测试。但是PubNub库是松散集成的,我们可以很轻松地将其注释掉。如果我们有许多紧密集成的库,那将很痛苦。
赫菲斯托斯

Answers:


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仅适用于AndroidN。我不认为我可以使用Java 8并且仍然向后兼容19。我不正确吗?
赫菲斯托斯

3
我在针对Android N时使用Java 8编译了代码,但是在Android 16上运行应用程序却没有问题。你可以测试它自己
Deepscorn

7
显然,不再需要dexOptions.incremental,因为它默认为true,请参见stackoverflow.com/questions/37522668
devconsole,2016年

1
请确保您了解使用Java 8的局限性,并且并非所有语言功能都向后兼容。developer.android.com/guide/platform/j8-jack.html
TrevJonez,2016年

3
请注意,“该android.dexOptions.incremental属性已弃用,并且对构建过程没有影响。”
约尼克

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
如果您的模块具有非Android专用的Java库,则这是正确的解决方案。
高兴

17
错误:已应用'java'插件,但与Android插件不兼容。
艾伦·西雅克

1
同意 “ java”插件显然与Android插件不兼容。不开心
Hephaestus

1
@Alen Siljak,应用插件:“您的插件名称”不必是Java。
nexDev

8

如果您使用org.jetbrains:annotation:15Retrolambda插件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

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

或在依赖项中添加

    sourceCompatibility = 1.7
    targetCompatibility = 1.7

所有模块中手动



5

我对greendao-generator依赖项有同样的问题。我错误地将该依赖项添加到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

在Android Studio 2.2中使用Gradle插件2.2.2关闭“即时运行”后,为我修复了该问题。切换回较旧版本的Gradle插件(例如2.2.0)也可以修复它,但是imho不太理想。


2

Android Studio 2.3.3发生了这种情况。我发现的解决方案是删除生成文件夹,然后删除Rebuild Project。就这么简单。


1

Android 2.3.3在添加了一些JAR缺陷之后,我也遇到了同样的错误。问题是由于铅垂io.netty:netty-all:4.1.16.Final。这个4.1.16版本的JAR是用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,但还是出现了同样的问题。
TomaszKryński,



0

尝试导入由Android Studio 3.0中的jdk 1.8编译的jar时遇到了此问题。我尝试了上述所有解决方案,但没有任何效果。因此,我要求该jar的开发人员使用jdk 1.7重新编译它,然后使其运行良好,不再遇到此问题。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.