我刚刚切换到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文件来查找代码修订版吗? 提前致谢。 -Hephaestus
答案 0 :(得分:86)
只需使用带有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 :(得分: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
}
答案 2 :(得分:8)
如果您使用org.jetbrains:annotation:15
和retrolambda插件,请从compile org.jetbrains:annotations:15.0
中删除行build.gradle
,错误就会消失。它对我有用。
答案 3 :(得分:7)
可能有些依赖项是使用Java 8编译的,而不是针对Android编译的。尝试将该依赖项切换为旧版本。我不知道你应该降级哪个库,因为你没有附上主模块的依赖列表。
例如:我遇到了同样的问题。经过几个小时的搜索,我发现库org.codehaus.httpcache4j.uribuilder:2.0.0
需要Java 8,从github开始。因此,当我切换到1.1.0
时,项目已成功构建和部署。
答案 4 :(得分:7)
尝试在 allprojects
部分添加到main build.gradletasks.withType(JavaCompile) {
sourceCompatibility = "1.7"
targetCompatibility = "1.7"
}
或在依赖项
中添加此项 sourceCompatibility = 1.7
targetCompatibility = 1.7
所有模块 手动
答案 5 :(得分:7)
我能够通过添加以下行来解决这个问题:
jackOptions {
enabled true
}
到defaultConfig
文件中的build.gradle
。
您可以在链接上遵循Java 8指南 - https://developer.android.com/guide/platform/j8-jack.html
答案 6 :(得分:5)
我对greendao-generator依赖有同样的问题。我错误地将依赖项添加到我的build.gradle(compile 'org.greenrobot:greendao-generator:3.1.0'
)和AndroidStudio中,向我显示了相同的错误消息。
可能是因为该模块已使用Java 8编译。
所以我从build.gradle中删除了这个依赖项,所有编译都很愉快:)
答案 7 :(得分:2)
我解决了下面这个问题:
apply plugin: 'java'
sourceCompatibility = 1.7
targetCompatibility = 1.7
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
答案 8 :(得分:2)
使用Gradle插件2.2.2关闭Android Studio 2.2中的Instant Run,为我修复了它。切换回Gradle插件的旧版本(例如2.2.0)也修复了它,但这不太适合imho。
答案 9 :(得分:2)
Android Studio 2.3.3发生了这种情况。我找到的解决方案是删除构建文件夹,然后重建项目。就这么简单。
答案 10 :(得分:1)
在添加少量JAR依赖项后,我在Android 2.3.3
中也遇到了同样的错误。问题是由于依赖性io.netty:netty-all:4.1.16.Final
。这个4.1.16版本的JAR是用Java 1.8编译的,其他所有版本都是用Java 1.7生成的。
在我的netty
文件中包含较旧版本的build.gradle
(使用Java 1.7生成)之后,这个问题得到了解决。
compile 'io.netty:netty-all:4.1.5.Final'
答案 11 :(得分:0)
尝试在Android Studio v 2.3.3中升级到自动值v 1.5时遇到此问题。自动值1.5可能与AS 3兼容(它需要更新的java编译器)
现在自动值1.4.1有效。
答案 12 :(得分:0)
我面临与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 它在我的情况下工作正常。
答案 13 :(得分:0)
我在Android Studio 3.0中尝试导入由jdk 1.8编译的jar时遇到过这个问题。我尝试了所有上述解决方案,但没有工作。所以,我问那个jar的开发人员用jdk 1.7重新编译它,然后它运行良好,没有再遇到这个问题。
答案 14 :(得分:0)
如果可能的话:
这应该解决问题。