[java] Android : Dex는 버전 52 바이트 코드를 구문 분석 할 수 없습니다.

방금 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 파일을 검사하여 코드 개정판을 찾을 수 있습니까? 미리 감사드립니다. -헤파이스토스



답변

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


답변

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
    }


답변

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


답변

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

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


답변

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

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

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

    sourceCompatibility = 1.7
    targetCompatibility = 1.7

모든 모듈 을 수동으로


답변

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

jackOptions {
    enabled true
}

defaultConfigbuild.gradle 파일입니다.

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


답변

greendao-generator 종속성과 동일한 문제가 발생했습니다. 이 종속성을 build.gradle ( compile 'org.greenrobot:greendao-generator:3.1.0')에 실수로 추가 했고 AndroidStudio에서 동일한 오류 메시지를 표시했습니다.

아마도 해당 모듈이 Java 8로 컴파일 되었기 때문일 것입니다.

그래서 내 build.gradle에서 해당 종속성을 제거하고 모두 행복하게 컴파일되었습니다. 🙂