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.

Java 1.7コード生成を強制するために、メインプロジェクトのgradle.buildファイルを既に更新しました。

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ファイルを検査できますか?前もって感謝します。-ヘファイストス


1
私は現在、このエラーに直面しています。解決策はありますか?
MetaSnarf 2016

私もAndroid Studioを2.1に更新しました。それ以来、私はこの問題に直面しています。何か解決策はありましたか?
Suresh Kumar

以前のエラーメッセージ(廃止されて以来)は、pubnub jarファイルが問題の一部であったことを示唆しています。そのため、pubnubへのすべての参照をコメントアウトし、コンパイルして実行します。コンパイラディレクティブ(上記)を追加してコードを「1.7」に強制すると、エラーメッセージが消えたと思いますが、1.8コードの一部がまだリークしているようです。
ヘファイストス

これは、関連する別のSOディスカッションです:stackoverflow.com/questions/36968728/…。しかし、これは「単純なテストプロジェクトから始める」と言う以外は、質問の答えにはなりません。
ヘファイストス2016

1
私たちがした唯一のことは、PubNubライブラリを引き出して、古いバージョンに置き換えることでした。それで問題は解決したようです。ただし、この場合は、ライブラリインポートとそのメソッド呼び出しをコメントアウトしてテストし、問題があったことを確認しました。しかし、PubNubライブラリは緩やかに統合されており、簡単にコメントアウトできました。緊密に統合されたライブラリが多数ある場合、それは苦痛です。
ヘファイストス2016年

回答:


89

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
ありがとうございました。しかし、私はSDK 19にビルドしており、23を使用していることを確認します。Java8はAndroid N専用であると思いました。Java8を使用でき、19との下位互換性があるとは思いません。間違っていますか?
ヘファイストス

3
Android NをターゲットにしながらJava 8でコードをコンパイルしましたが、Android 16でアプリを問題なく実行しました。自分でテストできます
Deepscorn

7
どうやらdexOptions.incrementalは、もはや真をデフォルトにするので必要とされ、見ないstackoverflow.com/questions/37522668
devconsole

1
Java 8の使用に関する制限を理解し、すべての言語機能に下位互換性があるわけではないことを確認してください。developer.android.com/guide/platform/j8-jack.html
TrevJonez

3
「このandroid.dexOptions.incrementalプロパティは非推奨であり、ビルドプロセスには影響しません。」
Jonik

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
    }

涼しい。ありがとう。やってみます。
ヘファイストス2016年

2
Android固有ではないJavaライブラリーを備えたモジュールがある場合、これは正しいソリューションです。
16年

17
エラー:「java」プラグインが適用されましたが、Androidプラグインと互換性がありません。
Alen Siljak 2017年

1
同意した。「java」プラグインは明らかにAndroidプラグインと互換性がありません。喜びがない。
ヘファイストス

1
@Alen Siljak、プラグインを適用:「プラグイン名」はJavaである必要はありません。
nexDev 2017年

8

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


7

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

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


fobo66:はい、同意します。これはほとんど私たちがやったことです。残念ながら、ますます多くのライブラリーがJava 8でコンパイルされるようになり、これが一般的な問題になると思います。これは、多くのライブラリがまだ2.6にあるように見えるPythonの世界のようです。
ヘファイストス2016年

おそらく、Pythonのように、すべてのライブラリがJ7とJ8の両方のバージョンとして個別に利用可能になることがすぐにわかります。
ヘファイストス2016年

7

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

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

またはこれを依存関係に追加する

    sourceCompatibility = 1.7
    targetCompatibility = 1.7

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


7

次の行を追加することで、この問題を解決できました。

jackOptions {
    enabled true
}

defaultConfigbuild.gradleのファイル。

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


1
ジャックは2017
nhoxbypass

そのリンクは、jackOptionsを削除するプロセスを説明しています。これはおそらく最良の解決策ではありません。
アンソニーナデオ2018年

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

Gradleプラグイン2.2.2を使用してAndroid Studio 2.2でInstant Runをオフにすると、修正されました。Gradleプラグインの以前のバージョン(2.2.0など)に戻すことによっても修正されましたが、それはあまり望ましくありません。


2

これは、Android Studio 2.3.3で発生しました。私が見つけた解決策は、ビルドフォルダーを削除してからプロジェクトビルドすることでした。それはそれと同じくらい簡単でした。


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ński2017年

0

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

現時点では、自動値1.4.1が機能します。



0

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.