【问题标题】:Android: Dex cannot parse version 52 byte codeAndroid:Dex 无法解析版本 52 字节码
【发布时间】:2016-08-29 11:01:54
【问题描述】:

我刚切换到 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 文件以找到代码修订版吗? 提前致谢。 -赫菲斯托斯

【问题讨论】:

  • 我现在正面临这个错误。有解决办法吗?
  • 我也将 Android Studio 更新到 2.1。从那时起,我就面临着这个问题。你有什么解决办法吗?
  • 较早的错误消息(此后已消失)表明 pubnub jar 文件是问题的一部分。所以我们注释掉了对 pubnub 的所有引用,它现在可以编译并运行。我相信当我们添加编译器指令(如上所示)以强制代码为“1.7”时错误消息消失了,但似乎一些 1.8 代码仍在泄漏。
  • 这是另一个相关的 SO 讨论:stackoverflow.com/questions/36968728/…。但是除了说“从一个更简单的测试项目开始”之外,这并不能回答这个问题。
  • 我们唯一做的就是拉出 PubNub 库并替换为旧版本。这似乎解决了它。但是在这种情况下,我们通过注释掉库导入及其方法调用并确定它有问题来进行测试。但是 PubNub 库是松散集成的,我们可以很容易地注释掉它。如果我们有许多紧密集成的库,那会很痛苦。

标签: java android maven android-studio


【解决方案1】:

只需将 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
    }
}

【讨论】:

  • 谢谢。但是,我正在构建 SDK 19,我注意到您使用的是 23。我认为 Java 8 仅适用于 Android N。我认为我不能使用 Java 8 并且仍然向后兼容 19。我不正确吗?
  • 我在以 Android N 为目标时使用 java 8 编译了代码,但在 Android 16 上运行应用程序没有任何问题。你可以自己测试一下
  • 显然 dexOptions.incremental 不再需要,因为它默认为 true,请参阅 stackoverflow.com/questions/37522668
  • 请确保您了解使用 java 8 的限制,并且并非所有语言功能都向后兼容。 developer.android.com/guide/platform/j8-jack.html
  • 请注意“android.dexOptions.incremental 属性已被弃用,它对构建过程没有影响。”
【解决方案2】:

如果您有一个带有 非 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
    }

【讨论】:

  • 酷。谢谢。我试试看。
  • 如果您的模块带有非 Android 特定的 java 库,这是正确的解决方案。
  • 错误:'java'插件已应用,但与Android插件不兼容。
  • 同意。 'java' 插件显然与 Android 插件不兼容。没有快乐。
  • @Alen Siljak,应用插件:“你的插件名称”不必是 java。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    您的某些依赖项可能是用 Java 8 编译的,而不是专门为 Android 编译的。尝试将该依赖项切换到旧版本。我不完全知道您应该降级哪个库,因为您没有附加主模块的依赖项列表。

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

    【讨论】:

    • fobo66:是的,我同意。这几乎就是我们所做的。我认为,不幸的是,越来越多的库很快将使用 Java 8 编译,这将成为一个常见问题。这似乎就像 Python 的世界一样,许多库似乎仍在 2.6 上。
    • 也许我们很快就会发现,就像 Python 一样,所有库都可以分别作为 J7 和 J8 版本使用。
    【解决方案5】:

    尝试在 allprojects

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

    或将其添加到依赖项

        sourceCompatibility = 1.7
        targetCompatibility = 1.7
    

    所有模块手动

    【讨论】:

      【解决方案6】:

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

      jackOptions {
          enabled true
      }
      

      build.gradle 文件中的defaultConfig

      您可以按照链接上的 Java 8 指南进行操作 - https://developer.android.com/guide/platform/j8-jack.html

      【讨论】:

      • Jack 自 2017 年 3 月 14 日起已弃用
      • 该链接描述了删除 jackOptions 的过程。这可能不是最好的解决方案。
      【解决方案7】:

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

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

      所以我从我的 build.gradle 中删除了该依赖项并愉快地编译了:)

      【讨论】:

        【解决方案8】:

        我解决了这个问题如下:

        apply plugin: 'java'
        
        sourceCompatibility = 1.7
        targetCompatibility = 1.7
        
        dependencies {
            compile fileTree(dir: 'libs', include: ['*.jar'])
        }
        

        【讨论】:

          【解决方案9】:

          使用 Gradle 插件 2.2.2 在 Android Studio 2.2 中关闭 Instant Run 已为我解决了这个问题。切换回旧版本的 Gradle 插件(例如 2.2.0)也修复了它,但恕我直言,这不太理想。

          【讨论】:

            【解决方案10】:

            这发生在我的 Android Studio 2.3.3 上。我找到的解决方案是删除 build 文件夹,然后 Rebuild Project。就这么简单。

            【讨论】:

              【解决方案11】:

              在添加了一些 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 生成)后,此问题得到解决。

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

              【讨论】:

              • 带着同样的问题来到这里,虽然 netty 页面说 java 1.6 足以使用 netty。
              【解决方案12】:

              我在尝试在 Android Studio v 2.3.3 中升级到 auto-value v 1.5 时遇到了这个问题。 Auto-value 1.5 可能与 AS 3 兼容(它需要更新的 java 编译器)

              目前自动值 1.4.1 有效。

              【讨论】:

                【解决方案13】:

                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 在我的情况下它工作正常。

                【讨论】:

                  【解决方案14】:

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

                  【讨论】:

                    【解决方案15】:

                    如果可能的话:

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

                    这应该可以解决问题。

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

                    【讨论】:

                      猜你喜欢
                      • 2017-11-04
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2020-01-05
                      • 2016-09-11
                      • 2013-12-19
                      相关资源
                      最近更新 更多