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

나도 Android Studio를 2.1로 업데이트했습니다. 그 이후로 나는이 문제에 직면하고 있습니다. 해결책이 있습니까?
Suresh Kumar 2016

이전 오류 메시지 (이후 사라짐)는 pubnub jar 파일이 문제의 일부임을 나타냅니다. 그래서 우리는 pubnub에 대한 모든 참조를 주석 처리했으며 이제 컴파일되고 실행됩니다. 코드를 "1.7"로 강제하기 위해 컴파일러 지시문 (위에 표시됨)을 추가했을 때 오류 메시지가 사라 졌다고 생각합니다. 그러나 1.8 코드 중 일부는 여전히 누출 된 것 같습니다.
Hephaestus

여기에 관련된 또 다른 SO 토론이 있습니다 : stackoverflow.com/questions/36968728/… . 그러나 "간단한 테스트 프로젝트로 시작"하는 것 외에는 질문에 대답하지 않습니다.
Hephaestus

1
우리가 한 유일한 일은 PubNub 라이브러리를 꺼내 이전 버전으로 교체하는 것입니다. 그것은 그것을 고치는 것 같았습니다. 그러나이 경우에는 라이브러리 가져 오기 및 메서드 호출을 주석 처리하고 문제가 있는지 확인하여 테스트했습니다. 그러나 PubNub 라이브러리는 느슨하게 통합되어있어 매우 쉽게 주석 처리 할 수 ​​있습니다. 긴밀하게 통합 된 라이브러리가 많으면 고통 스러울 것입니다.
Hephaestus

답변:


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에 있다는 것을 알고 있습니다. Java 8은 Android N 전용이라고 생각했습니다. Java 8을 사용할 수없고 여전히 19와 하위 호환성을 유지할 수 있다고 생각하지 않습니다. 내가 틀렸습니까?
Hephaestus

3
Android N을 대상으로하는 동안 Java 8로 코드를 컴파일했지만 문제없이 Android 16에서 앱을 실행했습니다. 직접 테스트 할 수 있습니다
Deepscorn

7
기본적으로 true이므로 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 전용아닌 자바 라이브러리가있는 모듈이있는 경우 다음과 같이 작동합니다.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
    }

멋있는. 감사. 시도해 볼게요.
Hephaestus

2
Android 전용이 아닌 Java 라이브러리가있는 모듈이있는 경우 이것이 올바른 솔루션입니다.
기꺼이

17
오류 : 'java'플러그인이 적용되었지만 Android 플러그인과 호환되지 않습니다.
Alen Siljak

1
동의합니다. 'java'플러그인은 Android 플러그인과 분명히 호환되지 않습니다. 기쁨이 없습니다.
Hephaestus

1
@Alen Siljak, 플러그인 적용 : '플러그인 이름'은 java 일 필요가 없습니다.
nexDev 2017 년

8

당신이 사용하는 경우 org.jetbrains:annotation:15와 retrolambda 플러그인은 다음 줄을 제거 compile org.jetbrains:annotations:15.0하여에서 build.gradle에러가 사라집니다. 그것은 나를 위해 작동합니다.


7

아마도 일부 종속성은 특히 Android가 아닌 Java 8로 컴파일되었습니다. 해당 종속성을 이전 버전으로 전환하십시오. 메인 모듈의 종속성 목록을 첨부하지 않았기 때문에 어떤 라이브러리를 다운 그레이드해야하는지 정확히 알 수 없습니다.

예를 들면 : 나는 같은 문제가 있었다. 몇 시간 동안 검색 한 결과 githuborg.codehaus.httpcache4j.uribuilder:2.0.0 에서 라이브러리 에 Java 8이 필요 하다는 것을 알았습니다 . 그래서으로 전환했을 때 프로젝트가 성공적으로 빌드되고 배포되었습니다.1.1.0


fobo66 : 네, 동의합니다. 이것은 우리가 한 것입니다. 안타깝게도 점점 더 많은 라이브러리가 곧 Java 8로 컴파일 될 것이며 이것은 일반적인 문제가 될 것입니다. 이것은 많은 라이브러리가 여전히 2.6에있는 것처럼 보이는 Python의 세계와 같습니다.
Hephaestus

아마도 우리는 곧 파이썬처럼 모든 라이브러리가 J7 및 J8 버전으로 별도로 제공된다는 것을 알게 될 것입니다.
Hephaestus

7

섹션 메인 build.gradle에 추가하려고 allprojects

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

또는 이것을 종속성에 추가하십시오.

    sourceCompatibility = 1.7
    targetCompatibility = 1.7

모든 모듈 을 수동으로


7

다음 줄을 추가하여이 문제를 해결할 수있었습니다.

jackOptions {
    enabled true
}

defaultConfigbuild.gradle 파일입니다.

https://developer.android.com/guide/platform/j8-jack.html 링크에서 Java 8에 대한 지침을 따를 수 있습니다.


1
Jack은 2017 년 3 월 14 일부터 지원 중단되었습니다
nhoxbypass

해당 링크는 jackOptions 제거 프로세스를 설명합니다. 이것은 아마도 최선의 해결책이 아닐 것입니다.
Anthony Naddeo

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.3JAR 종속성을 거의 추가하지 않은 후에도 에서 동일한 오류가 발생했습니다 . 문제는 의존성 때문이었습니다 io.netty:netty-all:4.1.16.Final. 이 4.1.16 버전 JAR은 Java 1.8로 컴파일되었으며 다른 모든 버전은 Java 1.7로 생성되었습니다.

nettybuild.gradle파일에 ( Java 1.7로 생성 된) 의 이전 버전을 포함시킨 후이 문제가 해결 되었습니다 .

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


netty 페이지에 java 1.6이 netty를 사용하기에 충분하다고 나와 있지만 동일한 문제로 여기에 왔습니다.
Tomasz Kryński 2011

0

Android Studio v 2.3.3에서 자동 값 v 1.5로 업그레이드하려고 할 때이 문제가 발생했습니다. 자동 값 1.5는 아마도 AS 3과 호환 될 것입니다 (업데이트 된 자바 컴파일러가 필요함).

지금은 자동 값 1.4.1이 작동합니다.



0

Android Studio 3.0에서 jdk 1.8로 컴파일 된 jar를 가져 오려고 할 때이 문제가 발생했습니다. 위의 모든 솔루션을 시도했지만 작동하지 않습니다. 그래서 나는 그 항아리의 개발자에게 jdk 1.7로 다시 컴파일하도록 요청한 다음 잘 작동하지만이 문제는 다시 발생하지 않습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.