Android Studio意外顶级例外:

今天我面临一个巨大的错误,不允许我在手机上运行示例项目。

当Android Studio构建项目时,它首先将以下目标显示为UP-TO-DATE

 .... :demoproject:processDebugResources UP-TO-DATE :demoproject:generateDebugSources UP-TO-DATE :demoproject:compileDebugJava UP-TO-DATE :demoproject:proguardDebug UP-TO-DATE .... 

在构建过程中,有许多这些UP-TO-DATE日志语句。 然而,他们总是停在:demoproject:dexDebug 。 对于dexDebug ,我似乎永远不会得到UP-TO-DATE日志语句。

相反, dexDebug后面跟着这个错误:

 :demoproject:dexDebug warning: Ignoring InnerClasses attribute for an anonymous inner class (com.xyz.corp.sample.project.demo.a) that doesn't come with an associated EnclosingMethod attribute. This class was probably produced by a compiler that did not target the modern .class file format. The recommended solution is to recompile the class from source, using an up-to-date compiler and without specifying any "-target" type options. The consequence of ignoring this warning is that reflective operations on this class will incorrectly indicate that it is *not* an inner class. 

现在有几十个Ignoring InnerClasses attribute错误。 它们甚至出现在v4支持库中的类中,这确实令人困惑。

最后,这些错误以一个新的声明结束:

 UNEXPECTED TOP-LEVEL EXCEPTION: at com.android.dx.command.dexer.Main.access$300(Main.java:83) at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:472) at com.android.dx.command.dexer.Main.main(Main.java:215) at com.android.dx.command.dexer.Main.runMonoDex(Main.java:280) at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166) at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406) at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:602) at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144) at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284) at com.android.dx.command.dexer.Main.run(Main.java:246) at com.android.dx.command.dexer.Main.processOne(Main.java:632) at com.android.dx.command.Main.main(Main.java:106) ...while parsing com/xyz/corp/sdk/AbcSDKConfig.class 1 error; aborting Error:Execution failed for task ':demoproject:dexDebug'. > com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0_40\bin\java.exe'' finished with non-zero exit value 1 com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000) at com.android.dx.command.dexer.Main.processFileBytes(Main.java:673) at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388) at com.android.dx.command.dexer.Main.processAllFiles(Main.java:510) ...while parsing com/xyz/corp/sdk/AbcSDKConfig.class 1 error; aborting at com.android.dx.command.dexer.Main.processClass(Main.java:704) at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251) 

我已经咨询过以下链接:

1. Gradle以非零退出值1结束

2. 编译期间“Ignoring InnerClasses属性”警告输出是什么?

我不确定它们适用于我的情况。 我甚至无法运行该项目。 我已将IDE更新为SDK Tools 22.0.1并修改了build.gradle文件中的buildToolsVersion标记,但无济于事。 有人可以指导我如何处理这个错误? 所有帮助将不胜感激。

哦,这是我的build.gradle

 apply plugin: 'com.android.application' android { compileSdkVersion 22 buildToolsVersion '22.0.1' packagingOptions { exclude 'META-INF/LICENSE' exclude 'META-INF/NOTICE' } defaultConfig { applicationId "com.xyz.corp.demo.project" minSdkVersion 10 targetSdkVersion 22 versionCode 2060200 versionName '2.6.02.00' } buildTypes { debug { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' applicationVariants.all { variant -> variant.outputs.each { output -> def file = output.outputFile output.outputFile = new File(file.parent, file.name.replace(".apk", "-" + defaultConfig.versionName + ".apk")) } } } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22.1.0' compile project(':xyzSDK') } 

帮忙!!!

因为它报告: bad class file magic (cafebabe) or version (0034.0000)您应该检查您是否正在编译与您尝试在运行时使用的相同Java版本。 如果您使用的是gradle,则应在build.gradle文件中使用以下或类似的条目:

 apply plugin: 'java' sourceCompatibility = 1.7 targetCompatibility = 1.7 

使用此链接可获得更多gradle详细信息。

在Android Studio中,从File -> Project Structure -> SDK Location -> JDK Location您应该使用jdk 1.7而不是在Project level设置中继。 有关类似的Android Studio问题,请参阅此链接 。

UNEXPECTED TOP-LEVEL EXCEPTION意味着您将被包含两次.jar

正如@Akhil所说,你应该排除support-v4因为我猜这是主要问题,但如果@Akhil的回答没有帮助你试试这个方法。

 compile (':xyzSDK') { exclude group: 'com.android.support', module: 'support-v4' } 

你试过删除这一行吗?

 compile 'com.android.support:appcompat-v7:22.1.0' 

也许:xyzSDK已经有appcompat-v7:22+ ..

我给你一个很好的答案@CommonsWare做一个gradle报告,看看有什么问题。

我正在为你的答案而努力,所以如果我找到了一些关注的东西,我会更新我的答案。

完成此操作后,您必须 Build -> Rebuild project

正如我在@dan上看到的答案……我告诉你一个可能的答案 。

而不是1.7如丹所说试着:

 compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } 

否则,您可以手动检查File > Project StructureCtrl + Alt + Shift + S然后在JDK location查看您正在使用的内容以及是否使用1.8更改为1.7 SDK路径

顺便说一下,我认为我已经读过你曾经问过你是否可以使用JAVA 8 for Android而不是JAVA 7如果我没有错误……是的你可以使用JDK 8 ,但gradle-retrolamba是你也使用gradle-retrolamba就像在这个问题上说的那样..

看来您的libs文件夹和库项目xyzSDK包含相同的库,这会在转换为dex时导致问题

您可以尝试识别此类库并将其从一个位置删除。 或者像这样排除它

 compile project(':xyzSDK'){ exclude module: 'support-v4' } 

我已经采用了support-v4的例子,因为我之前遇到了类似的问题。