web-dev-qa-db-ja.com

Android:Dexはバージョン52バイトコードを解析できません

私はちょうどアンドロイドスタジオ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
    }
}

Javaのバージョンを設定するために、モジュールgradle.buildを次のように更新しました。

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ファイルを調べることはできますか?前もって感謝します。 - ヘペストス

89
Hephaestus

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
    }
}
86
foolcage

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
    }
16
nexDev

org.jetbrains:annotation:15およびretrolambdaプラグインを使用している場合は、compile org.jetbrains:annotations:15.0からbuild.gradle行を削除するとエラーが消えます。わたしにはできる。

8
0wl

メインのbuild.gradleをセクションに追加してみてくださいallprojects

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

または依存関係にこれを追加してください

    sourceCompatibility = 1.7
    targetCompatibility = 1.7

すべてのモジュール手動で

7
vitalinvent

私は以下の行を追加することによってこの問題を解決することができました:

jackOptions {
    enabled true
}

build.gradleファイルのdefaultConfigに。

あなたはリンク上のJava 8のためのガイドラインに従うことができます - https://developer.Android.com/guide/platform/j8-jack.html

7
Faisal Ali

おそらく、あなたの依存関係のいくつかは、特にAndroid用ではなく、Java 8でコンパイルされています。その依存関係を古いバージョンに切り替えてみてください。メインモジュールの依存関係のリストを添付していないので、どのライブラリをダウングレードするのか正確にはわかりません。

例:私は同じ問題を抱えていた。何時間も検索した結果、ライブラリorg.codehaus.httpcache4j.uribuilder:2.0.0には github 以降のJava 8が必要であることがわかりました。だから、私が1.1.0に切り替えたとき、プロジェクトはうまくビルドされデプロイされました。

7
fobo66

私はgreendao-generator依存性についても同じ問題を抱えていました。誤ってその依存関係を私のbuild.gradle(compile 'org.greenrobot:greendao-generator:3.1.0')に追加したところ、AndroidStudioから同じエラーメッセージが表示されました。

おそらくそのモジュールはJava 8でコンパイルされているからです。

だから私は自分のbuild.gradleからその依存関係を取り除き、すべてうまくコンパイルしました:)

5

Gradleプラグイン2.2.2を使用してAndroid Studio 2.2のインスタントランをオフにすると、問題が解決しました。 Gradleプラグインの古いバージョン(2.2.0など)に切り替えても修正されていますが、それほど望ましくはありません。

2
StephanBezoen

私は以下のようにこの問題を解決しました:

apply plugin: 'Java'

sourceCompatibility = 1.7
targetCompatibility = 1.7

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

これはAndroid Studio 2.3.3で私に起こりました。私が見つけた解決策はビルドフォルダを削除してからプロジェクトの再構築です。それはそれと同じくらい簡単でした。

2
mp501

いくつかの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'

1
rashok

Android Studio 3.0でjdk 1.8によってコンパイルされたjarをインポートしようとしたときに、この問題に遭遇しました。上記の解決策をすべて試しましたが、うまくいきません。そのため、私はそのjarの開発者にjdk 1.7でそれを再コンパイルするように頼みました、そしてそれはそれからこの問題に再び遭遇しないで、うまくいきます。

0
uncle long

可能であれば、

  1. Androidのツールをにアップグレードします。classpath 'com.Android.tools.build:gradle:3.0.0'
  2. buildToolsVersion "26.0.2"

これで問題は解決します。

参照: https://developer.Android.com/studio/write/Java8-support

0
Kanika

AndroidおよびRxJava 2用のReactive Location APIライブラリ で同じ問題に直面しています。build.gradleを3.0.1に更新し、 AndroidおよびRxJava 2用のReactive Location APIライブラリ = 1.0.4から1.0.3のライブラリバージョンそれは私の場合はうまくいきます。

0

Android Studio v 2.3.3でauto-value v 1.5にアップグレードしようとすると、この問題に遭遇しました。自動値1.5はおそらくAS 3と互換性があるでしょう(それは最新のJavaコンパイラを必要とします)

今のところ自動値1.4.1が動作します。